为什么在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;
}
答案 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;
现在唯一的问题是:当我们尝试创建类的实例时,我们是否仍然只有前向声明,或者我们是否有完整的类型。