наследование от класса шаблона вызывает ошибки - PullRequest
0 голосов
/ 14 августа 2010

У меня есть шаблон класса MyTemplate.Работает нормально.Но как только я создаю другой класс, производный от него, я получаю ошибки.

//main.cpp
template <typename T> class MyTemplate {
    public:
        T* test() {
            return new T(this); //error here.
        }
};

template <typename T> class MyTemplate2 : public MyTemplate<T> { 
};

class MyClass {
    public:
        MyClass(MyTemplate2<MyClass>* source) {
        }
};

int main() {
    MyTemplate2<MyClass>().test();
    return 0;
}

Я получаю ошибку: main.cpp|4|error: invalid conversion from 'MyTemplate<MyClass>* const' to 'MyTemplate2<MyClass>*'

Как я понимаю, ошибка "this"в MyTemplate имеет тип MyTemplate.Но я хочу, чтобы это был MyTemplate2.Я могу сделать явное приведение, но это требует передачи второго аргумента классу шаблона, и, похоже, для этого должно быть лучшее решение.Есть ли?

Ответы [ 2 ]

3 голосов
/ 14 августа 2010

Вы пытаетесь просто передать Base* (что составляет this) в Derived*, что является неправильным путем. Вам необходимо явно привести к выполнению этого преобразования вниз.

0 голосов
/ 17 августа 2010

Как насчет использования подхода "клон"?

template <typename T> class MyTemplate { 
    public: 
        T* test() { 
            return clone(); //error here. 
        } 
        virtual T *clone() = 0;
}; 

template <typename T> class MyTemplate2 : public MyTemplate<T> {  
    public:
        T *clone(){return new T(this);}
}; 

class MyClass { 
    public: 
        MyClass(MyTemplate2<MyClass>* source) { 
        } 
}; 

int main() { 
    MyTemplate2<MyClass>().test(); 
    return 0; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...