我在编写的一些代码中遇到了一个非常奇怪的错误。 在以下示例中,代码背后的基本思想可以轻视:
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<double, double>::Ptr(Derived<double, double>*)
时没有匹配功能
候选人是。 。 。 (为简单起见,删除了一些)
Ptr<f, g>::Ptr(Base<f, g, Ptr<f, g> >*) [with f = double, g = double]
干杯,艾德
EDITED(更好地详细说明错误,在编译器上添加了信息)
答案 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(){};
};