2013-06-23 60 views
1

我有兩類:級聯C++模板用法

  1. ValueRange
  2. 菜單項

第三類菜單使用MenuItem類定義幾個菜單項目,每個項目具有的值的範圍( ints,float,boolean)。

我所做的是:

template <class T> 
class ValueRange{ 
    private: 
     T minValue; 
     T maxValue;   
    public: 
     void setMinValue(T minValue){this->minValue=minValue;}; 
     void setMaxValue(T maxValue){this->maxValue=maxValue;}; 
     ValueRange(){}; 
     ~ValueRange(){}; 
}; 

#include <string> 
#include "ValueRange.hh" 
class MenuItem{ 
    private: 
     std::string name; 
     /* 
     * does not compile... 
     * error: invalid use of template-name 'ValueRange' 
     * without an argument list 
     * error: 'ValueRange' is not a type 
     */ 
     ValueRange value; 
    public: 
     /* 
     * does not compile... 
     * error: 'class MenuItem' has no member named 'value' 
     */ 
     void setValueRange(ValueRange value){this->value=value;} 
     MenuItem(){}; 
     ~MenuItem(){}; 
}; 

我可如何實現類菜單項其屬性值是通用的,這樣我就可以有具有值範圍的菜單項整數,浮點數,布爾值等?

+1

抽象基類 –

回答

3

類模板++需要的實例化。例如:

ValueRange<int> 

是一個有效的類型。

ValueRange 

沒有類型不是。

要實現一個通用的菜單項,例如,你可以讓菜單項一個模板類爲好,或者你可以讓你ValueRange延長非模板基類,例如:

class ValueRangeBase { /* some virtual members here... */ }; 

template <class T> 
class ValueRange : public ValueRangeBase { /* same as before */ }; 

然後你可以使用ValueRangeBase(不是通過值雖然)作爲一個通用的ValueRange。這有時候很有用,但可能並不是你想要的。

+1

看着標題(「Cascading ...」),「ValueRangeBase」可能是海報想要的。 – dhavenith

+1

當然,'ValueRange'不是模板類,而是類模板。這可能聽起來很迂腐,但重點在於它不是*類,而是模板。可以從中生成類的模板,如「ValueRange 」或「ValueRange 」。讓術語直接是不會犯類似於問題中的錯誤的一大步驟:由於'ValueRange'沒有類(甚至不是模板類),因此它不能用作類型。但由於它是一個模板,它可以被實例化,並且因爲它是一個* class *模板,所以實例化是類,可以用作類型。 – celtschk

+0

啊,謝謝澄清!它肯定使一切更清晰。改變答案以及! – Filip

2

僅有參數化MenuItem相同ValueRange:用C

template<class T> 
class MenuItem 
{ 
    ... 
    ValueRange<T> value; 
    ... 
    void setValueRange(ValueRange<T> value) { ... } 
    ... 
};