繁体   English   中英

c++ 显式特化无法访问主要模板成员但可以访问部分特化成员?

[英]c++ explicit specialization can not access primay template member but can access partial specialization member?

#include <iostream>
using namespace std;

template<class T, int I>  // primary template
struct A {
    void f(); // member declaration
};
 
template<class T, int I>
void A<T,I>::f() { } // primary template member definition
 
// partial specialization
template<class T>
struct A<T,2> {
    void f();
    void g();
    void h();
};
 
// member of partial specialization
template<class T>
void A<T,2>::g() { 
    cout << "partial g()" << endl;
}

template<class T>
void A<T,2>::h() { 
    cout << "partial h()" << endl;
}
 
// explicit (full) specialization
// of a member of partial specialization
template<>
void A<char,2>::h() {
    cout << "explicit h()" << endl;
}
 
int main() {
    A<char,2> a2;
    a2.f(); // ERROR, partial can not access primary member
    a2.g(); // OK, uses partial specialization's member definition
    a2.h();  // OK, explicit h() being called.
}

我通过了cpp 参考,它说

“部分专业的成员与主模板的成员无关。”

所以可以理解, a2 不能访问主要专业化a2.f()的成员?

我的问题是

  1. 部分特化成员和显式特化成员之间的关系如何?

  2. 为什么 a2 可以在这里访问偏a2.g()的成员?

重要的是要认识到 class 模板不是 class,而只是一个蓝图。

A<char,2>匹配专用蓝图,因此它具有f,g,h成员函数。 主模板的内容被完全忽略。

因为A是一个模板 class,它的方法只有在实际调用时才会被实例化,并且只针对那些具体的模板 arguments 因为A的实例化是一个 class,因此它只有一组方法。

  • 由于您没有定义任何A<char,2>::f ,因此 linker 报告undefined reference错误。
  • 通过实例化template<class T> void A<T,2>::g() function 可以获得A<char,2>::g的定义 - 这是一种普通方法,而不是 function 模板。
  • 出于同样的原因, A<char,2>::h也可以编译 - 这个 function一个定义,不需要更多。

简而言之,编译器只会寻找它需要的定义,如果找到匹配的模板,它将生成定义。 否则,它会将符号标记为缺失,您有责任确保 linker 可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM