C++ 从模板类继承会导致错误
我有一个模板类MyTemplate。它很好用。但是,一旦我创建了另一个派生自它的类,就会出现错误C++ 从模板类继承会导致错误,c++,templates,inheritance,compiler-errors,C++,Templates,Inheritance,Compiler Errors,我有一个模板类MyTemplate。它很好用。但是,一旦我创建了另一个派生自它的类,就会出现错误 //main.cpp template <typename T> class MyTemplate { public: T* test() { return new T(this); //error here. } }; template <typename T> class MyTemplate2 : pub
//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
模板类MyTemplate{
公众:
T*test(){
返回新的T(this);//此处出错。
}
};
模板类MyTemplate2:公共MyTemplate{
};
类MyClass{
公众:
MyClass(MyTemplate2*源){
}
};
int main(){
MyTemplate2().test();
返回0;
}
我得到的错误是:main.cpp | 4 |错误:从“MyTemplate*const”到“MyTemplate2*”的转换无效。
据我所知,MyTemplate中的“this”属于MyTemplate类型。但我希望它是我的模板。我可以进行显式转换,但这需要向模板类传递第二个参数,似乎应该有更好的解决方案。有吗?您尝试的只是将
基*
(即此
)传递给派生*
,这是错误的方法。您需要显式强制转换来执行此向下转换 您尝试的只是将Base*
(即this
)传递给派生*
,这是错误的方法。您需要显式强制转换来执行此向下转换 使用“克隆”方法怎么样
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;
}
模板类MyTemplate{
公众:
T*test(){
返回clone();//此处出错。
}
虚拟T*clone()=0;
};
模板类MyTemplate2:公共MyTemplate{
公众:
T*clone(){返回新的T(this);}
};
类MyClass{
公众:
MyClass(MyTemplate2*源){
}
};
int main(){
MyTemplate2().test();
返回0;
}
使用“克隆”方法怎么样
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;
}
模板类MyTemplate{
公众:
T*test(){
返回clone();//此处出错。
}
虚拟T*clone()=0;
};
模板类MyTemplate2:公共MyTemplate{
公众:
T*clone(){返回新的T(this);}
};
类MyClass{
公众:
MyClass(MyTemplate2*源){
}
};
int main(){
MyTemplate2().test();
返回0;
}
另一个解决方案是让MyClass的构造函数采用MyTemplate*
参数。@在我的实际代码中,MyTemplate2有一些在MyClass构造函数中使用的附加属性/方法。如果不想在MyTemplate构造函数中执行强制转换,请在MyClass的构造函数中执行强制转换(这会有点令人不安,因为您会将有关派生类存在性的知识引入该库)。另一个解决方案是让MyClass的构造函数采用MyTemplate*
参数。@UncleBens在我的实际代码中,MyTemplate2有一些在MyClass构造函数中使用的附加属性/方法。如果不想在MyTemplate构造函数中执行强制转换,请在MyClass的构造函数中执行强制转换(这会有点令人不安,因为您会将有关派生类存在性的知识引入该库)。