У меня проблемы с очень странной ошибкой в коде, который я написал.
Основная идея кода может быть упрощена в следующем примере:
<code>
template <class f, class g> class Ptr;</p>
<p>template <class a, class b, class c = Ptr<a,b> >
class Base
{
public:
Base(){};
};</p>
<p>template <class d, class e>
class Derived : public Base <d,e>
{
public:
Derived(){};
};</p>
<p>template <class f, class g>
class Ptr
{
public:
Ptr(){};
Ptr(Base<f,g,Ptr<f,g> >* a){};
};</p>
<p>typedef Derived<double,double> DDerived;</p>
<p>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, поэтому стандартные указатели будут фактически бесполезны). Указатели предназначены для «указания» на базовый класс и поэтому могут указывать на любой унаследованный класс (как показано в примере).
Может кто-нибудь придумать, по какой причине не может работать в нетривиальном случае (но в случае, когда архитектура объекта остается идентичной).
Ошибка, возникающая в основном случае, выглядит следующим образом:
<code>
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]
Cheers, Ed
РЕДАКТИРОВАНИЕ (Детализация ошибки немного лучше, добавлена информация о компиляторе)