我的意思是修改以下代码,X声明是准确的,这样我就可以使用任何类型的对象B,B<int>
,B<real>
...可悲的是,重要的是我有B中的Obj<T>
* pobj。
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>*’
答案 0 :(得分:0)
您可能会这样做:
struct ObjBase
{
virtual void print() const = 0;
};
template <typename T>
class Obj : public ObjBase
{
public:
T a;
public:
Obj(T a_) : a(a_) {}
virtual void print() const
{ std::cout << "a : " << a << std::endl; }
};
template <typename T>
class A
{
public:
ObjBase *pObj;
public:
A(ObjBase* pO) : pObj(pO) {}
void doSomethingWithObj()
{ pObj->print(); }
static Obj<double> X;
};
也就是说,有一个基类为你想要做的事情提供一个不依赖于特定类型的接口。
答案 1 :(得分:0)
回答自己。
这是......我在测试中忘记了资格..
template <typename T>
class A
{
public:
Obj<T> *pObj;
public:
A(Obj<T>* pO) : pObj(pO) {}
void doSomethingWithObj()
{ pObj->print(); }
static Obj<T> X;
};
template<typename T>
Obj<T> Obj<T>::X(1.0);