在什么情况下C ++函数中允许缺少模板参数?

时间:2013-09-20 21:31:41

标签: c++ templates static struct

这是一个C ++代码,为什么第3行有错误:

模板结构和不使用模板参数

template<class T> void foo(T op1, T op2)
{
  cout<< "op1 = " << op1 << endl;
  cout<< "op2 = " << op2 << endl;

 }

 template<class T>
 struct sum
 {
    static void foo(T op1 , T op2)
    {
      cout << "sum is " << op1 << endl;
    }
 };


 int main()
 {
   foo(1,3);   // line 1
   foo<int>(1, '3'); // line 2
   sum::foo(1,2); // line 3
   return 0;
 }

第1行没有模板参数,但没有错误。

谢谢!

1 个答案:

答案 0 :(得分:5)

第3行正在尝试使用类模板的成员。

编译器可以/将(至少尝试)推断出函数模板参数的类型。在少数情况下,它无法推断出类型,因此您需要明确指定它。

编译器将尝试推断类模板参数的类型。

因此,第3行必须类似于sum<int>::foo(1, 2);。就其本身而言,sum只是类模板的名称,而不是类的名称。 ::之前的名称必须是类(或命名空间)的名称。