[英]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()
的成员?
我的问题是
部分特化成员和显式特化成员之间的关系如何?
为什么 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.