模板类的继承问题

时间:2009-02-25 13:33:48

标签: c++ inheritance templates

我在编写的一些代码中遇到了一个非常奇怪的错误。   在以下示例中,代码背后的基本思想可以轻视:


template <class f, class g> class Ptr;

template <class a, class b, class c = Ptr<a,b> > class Base { public: Base(){}; };

template <class d, class e> class Derived : public Base <d,e> { public: Derived(){}; };

template <class f, class g> class Ptr { public: Ptr(){}; Ptr(Base<f,g,Ptr<f,g> >* a){}; };

typedef Derived<double,double> DDerived;

int main() { Base<int,int> b = Base<int,int>(); Derived<double,double> d = Derived<double,double>(); DDerived dd = DDerived(); Ptr<double,double> p(&dd); return 1; }

基本思想是指针被Ptr类替换(这最终将用于MPI设置,因此标准指针实际上是无用的)。指针被设计为在基类中“指向”,因此可以指向任何继承的类(如示例中所示)。

任何人都可以想到这可能 在非平凡的情况下工作的任何原因(但是对象架构保持相同的情况)。

主要案例中发生的错误如下:


void function()
{
  vector nVector(1);  // cut down for simplicity
  nVector[0].SetId(1); // To ensure the node is instantiated correctly
  Ptr temp(&nVector[1]);
};

使用MPICXX:编译时,此代码会产生(稍微扩展版本的)错误   调用Ptr&lt;double, double>::Ptr(Derived&lt;double, double>*)时没有匹配功能
  候选人是。 。 。 (为简单起见,删除了一些)
  Ptr&lt;f, g>::Ptr(Base&lt;f, g, Ptr&lt;f, g> >*) [with f = double, g = double]

干杯,艾德

EDITED(更好地详细说明错误,在编译器上添加了信息)

3 个答案:

答案 0 :(得分:1)

不幸的是,我有点愚蠢,忘了将我的Ptr类放在与Base和Derived类相同的命名空间中。

我想,这就是它无法正常工作的原因! =]

答案 1 :(得分:0)

好的,这个:

class BasePtr
{
public:
    virtual void* obj() = 0;
};

template <class T>
class Ptr :: public BasePtr
{
public:
    Ptr() : ptr(0) {};
    Ptr(T* a) : ptr(a) {};
    virtual T* obj() { return ptr; }
protected:
    T* ptr;
};

在Base类中使用BasePtr,但在Base需要使用时传递正确的模板对象。

template <class a, class b >
class Base
{
public:
    Base(){};
    void set_ptr( BasePtr* );
};

DDerived dd = DDerived();
Ptr<double,double> p(&dd);
dd.set_ptr( p );

我仍然不太明白你的问题,但我希望有所帮助。

答案 2 :(得分:0)

尝试使用模板模板参数而不是默认值。

template <class a, class b, template <class aa, class bb> class c = Ptr >
class Base
{
typedef Ptr<a, b> pointer;
public:
    Base(){};
};