2010-08-13 106 views
0

我有一个模板类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。我可以做一个明确的转换,但是这需要向模板类传递第二个参数,并且似乎应该有更好的解决方案。在那儿?

+0

另一种解决方案是让MyClass的构造函数采用'MyTemplate *'参数。 – UncleBens 2010-08-13 22:21:20

+0

@UncleBens在我真实的代码中,MyTemplate2有一些额外的属性/方法在MyClass的构造函数中使用。 – Ponkadoodle 2010-08-13 22:24:27

+0

然后在MyClass的构造函数中进行强制转换,如果你不想在MyTemplate构造函数中进行强制转换(这会有点令人不安,因为你会向派生类中介绍有关派生类存在的知识)。 – 2010-08-13 22:36:35

回答

3

您尝试的仅仅是将Base*(即this)传递给Derived*,这是错误的方法。您需要明确投射以执行此向下转换。

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; 
}