我做了以下事情。
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>
的情况,可能是{{1}}的一些专门构造函数。
如何实施?
答案 0 :(得分:2)
模板特化是一种与继承完全不同的机制。它不扩展通用模板的内容:它用专门案例的新内容替换它们。所以编译器是对的:您的类A<B<Y>>
没有任何名为member
的字段。它只有一个构造函数,它带有int
和一些额外的自动生成的函数(复制构造函数,析构函数等)。
如果您想“继承”模板的内容,您有两个选择:
根据您的目的,其中一个选项会比另一个更好。
答案 1 :(得分:1)
这是如何实现它:
template <class C> class B{};
template <class X>
struct A{
int member;
};
template <class Y>
struct A<B<Y> >{ // A<
int member; // just add member here
A(int n):member(n){}
};
当你实施 class 模板专业化时,就像你正在定义一个全新的类。
我想你要找的是成员函数专门化,但是这个不支持部分特化,如果你试图专门化给定模板类的构造函数,那么必须隐式声明这个构造函数。 BR />
template <class C> class B{};
template <class X>
struct A{
A(int n); // I implicitly-declared the constructor that I want to specialize.
// you can still define it if you want.
int member;
};
// this is the contructor specialization,
// Note this isn't partial specialization, it's explicit specialization so you
// must provide a type that you want to specialize it with, in this case B<int>
template <>
A<B<int> >::A(int n):member(n){}