1

我执行以下操作。

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'  

如果 classA<B<Y>>完全分开,A那么一切都是正确的,并且可能没有A. 但我想要专业化A。及其所有内容。
或者,可能是一些专门的构造函数Afor case when Xis B<Y>
如何实施?

4

2 回答 2

2

模板特化是一种与继承完全不同的机制。它不扩展通用模板的内容:它用专门案例的新内容替换它们。所以编译器是对的:你的类A<B<Y>>没有任何名为member. 它只有一个构造函数,它接受一个int和一些额外的自动生成的函数(复制构造函数、析构函数等)。

如果你想“继承”模板的内容,你有两个选择:

  • 将模板中的所有内容复制到专业化中
  • 将公共内容放在基类中并从其继承

根据您想要做什么,这些选项中的一个会比另一个更好。

于 2013-01-04T11:21:29.750 回答
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){}
};

当您实现模板专业化时,就好像您正在定义一个全新的类。

我猜你正在寻找的是成员函数特化,但是这个不支持部分特化,如果你试图特化给定模板类的构造函数,那么这个构造函数必须是隐式声明的。

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){}
于 2013-01-04T11:41:34.987 回答