Может кто-нибудь найти хороший способ заставить следующий код работать? (Это, опять же, невероятно упрощенный способ сделать это)
<code></p>
<p>template <class f, class g> class Ptr;</p>
<p>class RealBase
{
};</p>
<p>template <class a, class b, class c = Ptr<a,b> >
class Base : public RealBase
{
public:
Base(){};
};</p>
<p>template <class d, class e>
class Derived : public Base <d,e>
{
public:
Derived(){};
void DerivedMethod(){};
};
template <class f, class g>
class Ptr
{
public:
Ptr(){};
Ptr(Base<f,g,Ptr<f,g> >* a){in = a;};
Base<f,g,Ptr<f,g> >* operator->()
{
return in;
};
private:
Base<f,g,Ptr<f,g> >* in;
};</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);
p->DerivedMethod();
return 1;
}
В данный момент компилятор стонет, потому что у Base <> нет DerivedMethod ();
EDIT
Я действительно понимаю проблему здесь, мой плохой из-за отсутствия объяснения в первом случае (я спешил). [Между прочим, это очень урезанный код, так что, ради простоты, у меня нет деструкторов или методов, которые действительно что-то делают. Просто игнорируйте это, это не имеет значения для проблемы.]
Что мне нужно сделать, так это то, что итератору (который здесь не описан), который имеет дело только с производным классом (D_Derived), необходим доступ к методу, который содержится в производном классе, а не в базовом классе. Простое добавление этого метода в базовый класс на самом деле не вариант, потому что эта ошибка произойдет много, если мне придется это сделать. (Существует около 10 классов, построенных на реальном базовом классе, и все они имеют свои собственные методы. Примерно 20 из них. Каждый.)
Кто-нибудь может придумать другой способ достижения этой функциональности?