【问题标题】:C++ template specialization of function: "illegal use of explicit template arguments"函数的 C++ 模板特化:“非法使用显式模板参数”
【发布时间】:2010-11-27 19:56:07
【问题描述】:

以下模板特化代码:

template<typename T1, typename T2>
void spec1()
{

}

测试用例 1:

template< typename T1> //compile error
void spec1<int>()
{

}

测试用例 2:

template< typename T2> //compile error
void spec1<int>()
{

}

产生以下编译错误:

错误 C2768:“spec1”:非法使用显式模板参数

有人知道为什么吗?

【问题讨论】:

  • 您使用的是什么平台/编译器?

标签: c++ templates template-specialization typename


【解决方案1】:

函数模板不能部分特化,只能完全特化,即:

template<>
void spec1<char, int>()
{

}

为什么函数模板不能部分特化,可以read this

当您部分专业化(仅可能用于课程)时,您必须这样做:

template <typename T1>
class class1<T1, int>
{

};

所以你必须再次列出T1

根据您的专业化编写方式,它们对于spec1&lt;int, int&gt; 来说是模棱两可的。

【讨论】:

  • 啊,所以我可以将部分专用的类嵌入静态函数?
  • 哦,我看到你链接到的文章已经解释了问题。我删除了我的答案,因为我发现在这种情况下转发到班级更方便。在 T1T2 被用作函数参数类型的情况下,我发现重载更具可读性,因为它就像正常的函数重载一样。
  • 当我读到“仅适用于课程”时,我犹豫了。我发现类和结构都可以;-)。
  • @LimitedAtonement:由于类和结构几乎是一回事,我可以接受“仅适用于类”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多