c++ - c++显式特化不能访问primay模板成员但可以访问部分特化成员?
问题描述
#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()
?
解决方案
重要的是要认识到类模板不是一个类,而只是一个类的蓝图。
A<char,2>
匹配专门的蓝图,所以它有f,g,h
成员函数。主模板的内容被完全忽略。
因为A
是一个模板类,它的方法只有在实际调用时才会被实例化,并且只针对那些具体的模板参数,因为实例化A
是一个类,因此它只有一组方法。
- 由于您没有定义 any
A<char,2>::f
,因此链接器会报告undefined reference
错误。 A<char,2>::g
实例化函数有一个可用的定义template<class T> void A<T,2>::g()
——即普通方法,而不是函数模板。- 出于同样的原因,
A<char,2>::h
也可以编译 - 这个函数有一个定义,不需要更多。
简而言之,编译器只会查找它需要的定义,如果找到匹配的模板,它将生成定义。否则,它将将该符号标记为丢失,并且您有责任让链接器使其可用。
推荐阅读
- reactjs - 在顶层使用带有上下文 api 的 useSelector 挂钩以提高性能
- matlab - 如何改变点云中平面的位置?
- mongodb - MongoDB Mongoose 在日期范围内选择文档
- javascript - ajax数据表,无法检索数据
- jquery - 请求了不受支持的 HTTP 方法“OPTIONS”,而我设置为 HTTP 方法:“POST”
- laravel - Laravel 嵌套 Foreach 的常见问题视图试图获取非对象的属性
- java - 如何向洋葱服务器发送http请求?
- html - 布局菜单项,更改所选页面“项目”的样式
- prometheus-alertmanager - Alertmanager 中的指纹字段是否唯一?
- android - Ionic 4 与 Ionic 3 中的后台工作人员