模板问题,专业化
Posted
技术标签:
【中文标题】模板问题,专业化【英文标题】:Template questions, specialization 【发布时间】:2020-07-16 18:10:50 【问题描述】:有谁知道为什么template<class T1, class T2> void A<T1, T2, 4>::f0()
编译失败?我会认为这是一个专业化?
这些理解也正确吗?
-
对于
// A
,模板参数的值用于构建参数列表,该列表用于通过将类定义为class A<A0, ..., An>
来实例化模板。
对于// B
,当编译器需要为f0()
生成代码时,它会搜索与函数关联的类的模板定义。如果找到专用版本,则使用该版本。如果没有找到专用版本,则选择非专用版本A<T1, T2, I>
,其中模板参数是从表单中推导出来的。
谢谢!
// A
template<class T1, class T2, int I>
class A
public:
void f0();
; // primary template
// B
template<class T1, class T2, int I>
void A<T1, T2, I>::f0()
cout << "x" << endl;
template<class T1, class T2>
void A<T1, T2, 4>::f0()
cout << "x" << endl;
template<>
void A<int, int, 4>::f0()
cout << "z" << endl;
编译:
clang++ -std=c++11 -pedantic -Wall test176.cc && ./a.out
test176.cc:17:20: error: nested name specifier 'A<T1, T2, 4>::' for declaration does
not refer into a class, class template or class template partial specialization
void A<T1, T2, 4>::f0()
【问题讨论】:
这能回答你的问题吗? C++ partial method specialization 【参考方案1】:主要原因是partial template class specialization 必须在声明其功能之前定义。特别是,您必须在声明其成员函数之前声明专门的类:
template<class T1, class T2>
class A<T1,T2,4>
public:
void f0();
;
值得注意的是,您的最后一个示例 A<int,int,4>::f0()
是一个 (explicit) full class specialization,它与部分规则具有不同的规则,这就是该定义不会编译失败的原因。
【讨论】:
【参考方案2】:template<class T1, class T2>
void A<T1, T2, 4>::f0()
需要专门定义:
template<class T1, class T2>
class A<T1, T2, 4> ;
【讨论】:
以上是关于模板问题,专业化的主要内容,如果未能解决你的问题,请参考以下文章