我有一个问题,涉及以下代码片段(这是一个非常简化的示例,可以重现我的程序中的错误):
#include <iostream>
using namespace std;
template<class T> class CBase
{
public:
template <class T2> CBase(const T2 &x) : _var(x) {;}
template <class T2> CBase (const CBase<T2> &x) {_var = x.var();}
~CBase() {;}
T var() const {return _var;}
protected:
T _var;
};
template<class T> class CDerived : public CBase<T>
{
public:
template <class T2> CDerived(const T2 &x) : CBase<T>(x) {;}
template <class T2> CDerived (const CBase<T2> &x) : CBase<T>(x) {;}
~CDerived() {;}
};
int main()
{
CBase<double> bd(3);
CBase<int> bi(bd); // <- No problem
CDerived<double> dd1(3);
CDerived<double> dd2(dd1);
CDerived<int> di(dd1); // <- The problem is here
return 0;
}
错误如下:
error: cannot convert 'const CDerived<double>' to 'int' in initialization
如何解决这个问题?(优先在基类中进行修改,而不是在派生类中进行修改,如果可能的话,不使用虚拟性)。非常感谢。
编辑: 如果我将有关行替换为:
CDerived<int> di(CBase<int>(CBase<double>(dd1)));
它就可以工作了,但不太实用...编辑:似乎通过以下方法解决了:
template <class T2> CDerived(const CDerived<T2> &x) : CBase<T>(static_cast<const CBase<T2>&>(x)) {;}
私有地
派生出来了。这是故意的还是一个错误? - Nawaz