我执行以下操作。
template <class C> class B{};
template <class X>
struct A{
int member;
};
template <class Y>
struct A<B<Y>>{
A(int n):member(n){}
};
int main(int, char**){}
即X类可能是模板本身,因此我想对A类模板进行特化处理。
但是编译器说:
d:\>g++ -std=gnu++11 -o spec.exe spec.cpp
spec.cpp: In constructor 'A<B<Y> >::A(int)':
spec.cpp:11:14: error: class 'A<B<Y> >' does not have any field named 'member'
如果
A<B<Y>>
类与A
完全分开,则一切正确,并且A
可能没有任何成员。但是我想要A
的特化。及其所有内容。或者,对于
A
是X
的情况,可能是B<Y>
的一些专用构造函数。如何实现?
最佳答案
模板专门化是一种与继承完全不同的机制。它不扩展常规模板的内容:而是将其替换为特殊情况的新内容。因此编译器是正确的:您的类A<B<Y>>
没有任何名为member
的字段。它只有一个采用int
的构造函数和一些其他自动生成的函数(复制构造函数,析构函数等)。
如果要“继承”模板的内容,则有两个选择:
根据您要执行的操作,这些选项之一将比另一个更好。
关于c++ - 模板类的模板特化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14156044/