我正在围绕这个问题进行包装。我认为这实际上是不可能的,但只是为了确定我想问问在这里是否真的有解决方案。 考虑下面的代码。有2个模板类A和B以及两个分别来自A和B的非模板类C和D.模板类有两种类型,继承和前向声明
// definition of class A
template <class DerivedA, class DerivedB> class A {
private:
DerivedB data;
public:
A(const DerivedB& data) : data(data) {}
virtual ~A() {}
DerivedB get() const { return data; }
};
// definition of class B
template <class DerivedA, class DerivedB> class B {
private:
DerivedA data;
public:
B(const DerivedA& data) : data(data) {}
virtual ~B() {}
DerivedA get() const { return data; }
};
// forward declaration of D
class D;
// definition of class C, derives from A<C, D>
class C : public A<C, D> {
private:
int extraInfo;
public:
C(const D& d) : A(d) {}
virtual ~C() {}
int getExtraInfo() const { return extraInfo; }
};
// definition of class D, derives from B<C, D>
class D : public B<C, D> {
private:
int extraInfo;
public:
D(const C& c) : B(c) {}
virtual ~D() {}
int getExtraInfo() const { return extraInfo; }
};
这里的问题是,类C不能被定义,因为类D只是前向声明。因此,当模板A被写出时,它不知道它的私有成员的类型是什么。请注意,我无法使用指针,我需要一些已知的功能。是否有可能编译这样我有我的课程C和D?
什么阻止你使用指针? – Henrik
你想达到什么目的? –
@YochaiTimmer我试图实现一个有向图。类A代表节点,类B代表弧。为了实际使用具有有用属性的有向图,节点和边必须从节点类和边类中派生出来。为了避开'dynamic_cast',我尝试使用这种模板化方法。 – rwols