2013-09-29 76 views
0

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

+0

'乙从一个''这反过来从'的OBJ ''派生派生。这是一个完全不同于'X'的类型,它是'Obj '。这就是为什么你不能叫'A (* X)'。 –

回答

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

也就是说,有一个基类为你想做的事情提供了一个不依赖于特定类型的接口。

+0

类型T用于向量,3D空间中的长度精度,所以它们基本上都取决于类型。它只能是真实的或双重的,真的。 – user2287453

+0

@ user2287453:代替在'A '中有'Obj '指针,如何让一个包含X中值的副本的'Obj '成员? –

+0

这将工作,我想这就是我将要使用的,但你猜对了,有很多的对象B.他们真正需要的是X的1个模型,所以感觉就像是浪费。 – user2287453

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); 
相关问题