шаблонные определения типов и наследование - PullRequest
0 голосов
/ 04 октября 2011

Я хочу, чтобы typedef в моем базовом классе был специализированным для каждого класса, производного от этого базового класса.код:

template<class X>
class SharedPointer
{
public:
    X* data;
    SharedPtr(X *val)
    {
        data = val;
    }
};

template<class T=Base> /* default type, I know this is a mistake. 
The reason to have this here is to just indicate that the default argument 
should be Base itself. so it'll have a Base type of shared pointer. */
class Base
{
public:
    typedef SharedPointer<T> MyTypeOfPtr;
    virtual MyTypeOfPtr Func()
    {
        Base *b = new Base;
        return MyTypeOfPtr(b);
    }
};

class Derived : Base<Derived>
{
public:
    MyTypeOfPtr Func()
    {
        Derived *d = new Derived;
        return MyTypeOfPtr(d);      
    }
};

main()
{
 Base b;
 Base::MyTypeOfPtr ptr1 = b.Func();
 Derived d;
 Derived::MyTypeOfPtr ptr2 = d.Func();  
}

но это не компилируется.Есть ли способ получить эту функциональность?

1 Ответ

2 голосов
/ 04 октября 2011

Вы должны правильно получить все виды деталей:

  • Правописание: "SharedPointer" или "SharedPtr"?

  • Шаблоны и классыэто не одно и то же, поэтому вы не можете иметь class T = Base: T - это класс, Base - нет.Кроме того, вы не можете использовать ссылку по умолчанию на себя, поэтому даже class T = Base<T> не работает.Удалите тип по умолчанию.

  • Наследование классов по умолчанию является закрытым, так что class Derived : public Base<Derived>.

  • Сделать конструктор из SharedPointer общедоступным.

  • Base::Func() не имеет смысла;может быть, это должно сказать new T.

Я должен серьезно предложить вам начать с более простых примеров и строить медленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...