首页 > 试题广场 >

下列代码可以通过编译吗?如何修改使其通过编译?

[单选题]
下列代码可以通过编译吗?如何修改使其通过编译?
template <class T>
struct sum {
  static void foo(T op1 , T op2){
  	cout << op1 <<op2; 
  }
};
sum::foo(1,3);
  • 编译通过
  • 应该去掉static关键字
  • 调用应该如下: sum<int>:: foo(1,3)
  • 调用应该如下: sum:: <int>foo(1,3)
template<class T>  struct sum{
  static void foo(T op1 , T op2){
   cout << op1 <<op2;
  }
};
sum<int>::foo(1,3);
发表于 2015-04-15 16:13:48 回复(0)
这一题加深了我对模板知识的理解,做一点小小的分享
很多答友已经给出了模板、类模板,以及静态成员函数的概念,百度里也有不少。(假设这里你已经懂了)

正确答案C,我第一次选的A,因为在函数模板中,体化时可以不给定模板实际参数,编译器自动识别进行体化,而在类模板的体化中,与函数模板不同,类模板的体化必须给定模板实际参数,如:A<T> a; 所以本例编译不通过,考的就有这个知识点。

那为什么D错了,还是回到前面讲的类模板的体化格式诸如 A<T> a;
A是一个模板, A加上<T>以后:A<T>这个整体才是我们要的“类”,所以是语法错误
编辑于 2017-07-14 00:58:20 回复(1)
这道题的考点是类模板的static成员。首先说说模板实例化,即类模板需要指定确定的类型,例如本题中sum<int> a或者sum<string> a等。   static成员函数可以由类名或者对象直接调用。在本题中,sum<int>  a;a.foo(1,3)或者sum<int>::foo(1,3)。两种形式均可。
发表于 2015-11-11 09:33:31 回复(4)
这道题考查c++模板

template <class 形参名class 形参名,......返回类型 函数名(参数列表)

{

函数体

}

其中templateclass是关键字,class可以用typename 关键字代替,在这里 typename 和class没区别 ,<>括号中的参数叫 模板形参 ,模板形参和函数形参很相像, 模板形参不能为空 一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名。 模板形参需要调用该模板函数时提供的模板实参来初始化模板形参,一旦编译器确定了实际的模板实参类型就称他实例化了函数模板的一个实例。比如swap的模板函数形式为

template <class T> void swap(T& a, T& b){},

当调用这样的模板函数时类型T就会被被调用时的类型所代替,比如swap(a,b)其中abint 型,这时模板函数swap中的形参T就会被int 所代替,模板函数就变为swap(int &a, int &b)。而当swap(c,d)其中cddouble类型时,模板函数会被替换为swap(double &a, double &b),这样就实现了函数的实现与类型无关的代码。
所以应该改成这样了。有点define的味道哦。
template<class T>  struct sum{
  static void foo(T op1 , T op2){
   cout << op1 <<op2; 
  }
};
sum<int>::foo(1,3);
发表于 2015-08-24 22:45:56 回复(3)
记住:<T>永远在::前面!!!!!!!!

发表于 2021-10-23 10:24:58 回复(0)
本体考察的知识点就是函数模板可以不说明对象,类模板必须要说明类型
发表于 2018-04-14 13:15:27 回复(0)
静态函数调用是通过类名来的,而后面那个int表明模版中函数参数类型是int,而不是返回值类型
发表于 2017-05-01 19:25:19 回复(0)
static成员函数,static成员是类的组成部分并不是任何对象的组成部分,因此,static成员函数没有this指针。我们知道,一般而言,类中的成员函数具有一个附加的隐含实参,即指向该类对象的一个指针。这个隐含实参命名为this。因为static成员函数不是任何对象的组成部分,所以static成员函数就没有this形参了。由于成员函数声明为const说明该成员函数不会修改该成员函数所属的对象,所以static成员函数不能声明为const。为什么呢?因为static成员函数不是任何对象的组成部分。static成员函数可以直接访问所属类的static成员,但是不能直接使用非static成员函数!也不能访问static const 类型的成员!
发表于 2016-05-27 11:29:10 回复(1)

该代码无法通过编译。原因是模板结构体sum的静态成员函数foo没有指定模板参数类型,而在调用foo函数时又没有指定模板参数类型,导致编译器无法确定模板参数类型。

为了使代码能够通过编译,可以按照以下方式修改:

cppCopy Code
template <class T> struct sum { static void foo(T op1 , T op2){ cout << op1 << op2; } }; // 调用时需要指定模板参数类型 sum<int>::foo(1,3);

在上述代码中,我们将调用foo函数时的模板参数类型指定为int,这样编译器就能够确定模板参数类型,从而通过编译。

发表于 2023-10-24 19:42:03 回复(0)
选项 A 表示“编译通过”,但是没有考虑到模板参数的问题。
选项 B 提到去掉 static 关键字,但 static 关键字的存在与否与模板调用的方式没有直接关系。
选项 D 中的语法是错误的,sum:: <int>foo(1,3) 不是正确的函数调用语法。
发表于 2023-08-30 11:47:21 回复(0)
函数模板有自动类型推导。
类模板没有自动类型推导。
发表于 2022-08-18 15:22:56 回复(0)
只有函数模板的模板参数可以省略
发表于 2021-08-24 22:31:20 回复(0)
真的能编过吗?
发表于 2021-06-18 23:51:34 回复(0)
template <class T>
struct sum {
	static void foo(T op1, T op2) {
		cout << op1 << op2;
	}
};
sum<int>::foo(1, 3);
E0147    声明与 "void sum<T>::foo(T op1, T op2) [其中 T=int]" (已声明 所在行数:16) 

发表于 2021-03-31 19:20:19 回复(0)
struct和class都是类定义关键字
编辑于 2018-04-04 08:46:32 回复(0)
尴尬
发表于 2017-11-09 20:28:57 回复(0)
不要跟类型推导混淆
发表于 2017-07-28 21:39:56 回复(0)
▶ g++ test.cc
test.cc: In function ‘int main()’:
test.cc:14:2: error: ‘template<class T> struct sum’ used without template parameters
  sum::foo(1,3);

发表于 2016-08-18 16:34:52 回复(0)
这题选什么
发表于 2015-10-02 11:04:54 回复(0)
D
发表于 2015-05-14 21:48:42 回复(0)