这不起作用。为了实例化A
,编译器需要至少有一个前向声明x
。但是你不能转发declare类型的成员,因为这是类型的实现细节,并且意味着你已经知道了关于类的一些部分。
你可以,不过,要返回类型通过直接A
,并以此作为返回类型:
template <typename T>
class A
{
public:
typedef T ret_type;
virtual ret_type* function() = 0;
};
class B : public A<int>
{
public:
A::ret_type obj;
virtual A::ret_type* function() override
{
return &obj;
}
};
通过这种方法,你可以这样做:
class X : public A<int> { ... };
class Y : public A<int> { ... };
A<int>* p1 = new X();
A<int>* p2 = new Y();
p1->function();
p2->function();
.. 。使基类更有用。
父母不需要知道任何关于孩子的事情,否则继承变得毫无意义。在你的情况下,A
可以被认为是一个接口,任何实现接口A<int>
的类将表现相同。相反,如果您将子级传递给A
,则每个接口实现都是不同且唯一的,即使它可能具有完全相同的返回类型。如果你真的需要这个,可以考虑将A
作为一个实用类并作为成员嵌入到子类中(“支持继承的组合”)。
你不这样做吗? – Paranaix
获取错误'无效使用未定义类型'B类' – rajenpandit
是不是这个问题非常类似于讨论[这里](http://stackoverflow.com/q/17478621/420683)? – dyp