从模板类继承导致错误
问题描述:
我有一个模板类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>*'
按我的理解错误, “本” 在MyTemplate的类型是MyTemplate的的。但我希望它是MyTemplate2。我可以做一个明确的转换,但是这需要向模板类传递第二个参数,并且似乎应该有更好的解决方案。在那儿?
答
您尝试的仅仅是将Base*
(即this
)传递给Derived*
,这是错误的方法。您需要明确投射以执行此向下转换。
答
如何使用“克隆”方法?
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;
}
另一种解决方案是让MyClass的构造函数采用'MyTemplate *'参数。 –
UncleBens
2010-08-13 22:21:20
@UncleBens在我真实的代码中,MyTemplate2有一些额外的属性/方法在MyClass的构造函数中使用。 – Ponkadoodle 2010-08-13 22:24:27
然后在MyClass的构造函数中进行强制转换,如果你不想在MyTemplate构造函数中进行强制转换(这会有点令人不安,因为你会向派生类中介绍有关派生类存在的知识)。 – 2010-08-13 22:36:35