有没有办法进行模板声明

时间:2013-09-29 17:55:15

标签: c++ templates

我的意思是修改以下代码,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>*’

2 个答案:

答案 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);