2013-09-29 214 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); 
相關問題