模板循环继承

ura*_*ray 3 c++ inheritance templates circular-dependency incomplete-type

在这段代码中,编译器抱怨undefined MyClassB,这是可以理解的:

class MyClassA;
class MyClassB;

template <class T> class BaseClass : public T {
};

class MyClassA : public BaseClass<MyClassB> {
};

class MyClassB : public BaseClass<MyClassA> {
};
Run Code Online (Sandbox Code Playgroud)

但在这段代码,编译是成功的,并没有抱怨有关MyClassB:

class MyClassA;
class MyClassB;

template <class T> class BaseClass : public T {
};

class MyClassA : public BaseClass<std::vector<MyClassB>> {
};

class MyClassB : public BaseClass<std::vector<MyClassA>> {
};
Run Code Online (Sandbox Code Playgroud)

为什么第二个代码编译,因为MyClassB在构造时尚未定义std::vector<MyClassB>

GMa*_*ckG 6

因为您的实现std::vector允许不完整的类型.这是类模板的成员函数的实例化规则的副作用:它们在被使用之前不会被实例化.这样的功能需要它是一个完整的类型不实例化,还没有.所以没有错误.

相反,它确实需要是一个完整的类型才能成为基类,因此在这种情况下会出现错误.


但是,将不完整的类型传递给std::vector(或任何其他标准库容器)实际上是未定义的行为,"它工作"是一个有效的未定义结果.你不应该这样做.