【问题标题】:In what situations template parameters missing is allowed in C++ function?在什么情况下 C++ 函数中允许缺少模板参数?
【发布时间】:2013-09-20 21:31:40
【问题描述】:

是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) 模板参数推导 2) 显式模板参数 3) 没有模板参数 -- 错误
  • 搜索“模板参数推导”并从标准中读取 14.8.2 - 您需要的所有信息都在那里。

标签: c++ templates static struct


【解决方案1】:

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

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

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

因此,第 3 行需要类似于sum&lt;int&gt;::foo(1, 2);sum 本身只是类模板的名称,而不是类的名称。 :: 前面的名称必须是类(或命名空间)的名称。

【讨论】:

  • 好吧,从不就像在还没有。已经为 C++ 的未来迭代提出了允许模板参数推导的构造函数语法。基本上,无需编写这么多foo&lt;blah&gt; make_foo( blah b ) 函数。
  • @user2420472:简短的回答是标准的编写方式。
猜你喜欢
  • 2018-08-31
  • 2020-11-29
  • 2012-09-15
  • 1970-01-01
  • 2019-06-01
  • 2018-09-08
  • 2016-09-18
  • 2022-11-24
  • 1970-01-01
相关资源
最近更新 更多