在完全专业化中,为什么继承使前向声明(没有定义)不再足够?

时间:2011-08-21 02:53:55

标签: c++ template-specialization

为什么在template<typename T> struct Child : public Parent下面的代码中需要一个定义,而template<typename T> struct Orphan不需要一个定义(但是一个的存在不会受到伤害)?

#include <iostream>

struct Parent {};

// A definition is necessary.
template<typename T>
struct Child : public Parent
{};

template<>
struct Child<int> : public Parent
{
    Child() {
        std::cout << "Child<int>::Child: full specialization\n";
    }
};

// No definition is necessary (but the presence of one doesn't hurt).
template<typename T>
struct Orphan;

template<>
struct Orphan<int>
{
    Orphan() {
        std::cout << "Orphan<int>::Orphan: full specialization\n";
    }
};

int main()
{
    Orphan<int> orphan;
    Child<int> child;
}

2 个答案:

答案 0 :(得分:1)

为了继承你总是需要一个完整的类定义。

为了专门化所有编译器需要知道的是模板类的名称。在这种情况下,当需要完整定义时,任何专业化的使用都会起作用。使用非int - 专用版只会被视为可以使用前向声明。

答案 1 :(得分:1)

template<typename T>
struct Orphan;

这是完全正常的前瞻声明。

我认为该语言只是禁止包含父语句声明的前向声明。这样的语法不存在。

所以它与模板没什么关系。你不能做以下任何事情

class Base {};

class Derived: public Base;  //forward declaration of Derived

在您的情况下,您可以像往常一样转发声明儿童

template <class T>
class Child;

现在唯一的问题是:当我们尝试创建类的实例时,我们是否仍然只有前向声明,或者我们是否有完整的类型。