模板问题,专业化

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&lt;int,int,4&gt;::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> ;

【讨论】:

以上是关于模板问题,专业化的主要内容,如果未能解决你的问题,请参考以下文章

模板专业化 VS 函数重载

非专业模板中模板专业化的成员访问

功能模板专业化的重要性和必要性

c ++模板专业化和模板参数的数量

模板专业化结构大小

Clang 可变参数模板专业化错误:不可演绎的模板参数