C++ 从模板类继承会导致错误

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

我有一个模板类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
模板类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的构造函数中执行强制转换(这会有点令人不安,因为您会将有关派生类存在性的知识引入该库)。