我执行以下操作。

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的特化。及其所有内容。
或者,对于AX的情况,可能是B<Y>的一些专用构造函数。
如何实现?

最佳答案

模板专门化是一种与继承完全不同的机制。它不扩展常规模板的内容:而是将其替换为特殊情况的新内容。因此编译器是正确的:您的类A<B<Y>>没有任何名为member的字段。它只有一个采用int的构造函数和一些其他自动生成的函数(复制构造函数,析构函数等)。

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

  • 将模板中的所有内容复制到特化的
  • 将公共(public)内容放在基类中并从中继承

  • 根据您要执行的操作,这些选项之一将比另一个更好。

    关于c++ - 模板类的模板特化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14156044/

    10-11 23:01
    查看更多