我的意思是修改下面的代碼,X聲明是確切的,以便我可以使用任何類型的對象B,B<int>
,B<real>
......不幸的是,重要的是我有一個Obj<T>
* pobj在B.有沒有辦法做模板聲明
template <typename T>
class Obj
{
public:
T a;
public:
Obj(T a_) : a(a_) {}
void print() const
{ std::cout << "a : " << a << std::endl; }
};
template <typename T>
class A
{
public:
Obj<T> *pObj;
public:
A(Obj<T>* pO) : pObj(pO) {}
void doSomethingWithObj()
{ pObj->print(); }
static Obj<double> X;
};
Obj<double> X = Obj<double>(1.0);
template <typename T>
class B : public A<T>
{
public:
B() : A<T>(&X) {}
void doSmthg()
{ X.print(); }
};
// in main
B<int> b;
b.doSmthg();
該代碼將返回no known conversion for argument 1 from ‘Obj<double>*’ to ‘Obj<int>*’
'乙從一個''這反過來從'的OBJ ''派生派生。這是一個完全不同於'X'的類型,它是'Obj '。這就是爲什麼你不能叫'A (* X)'。 –