1

私は2つのクラスを持っています:

  1. 値の範囲
  2. メニュー項目

3 番目のクラス Menu は、MenuItem クラスを使用して、それぞれが値の範囲 (int、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(){};
};

属性値が一般的なMenuItem クラスを実装して、int、float、boolean などの値の範囲を持つ menuItem を作成するにはどうすればよいですか?

4

2 に答える 2

3

C++ のクラス テンプレートには、インスタンス化が必要です。例えば:

ValueRange<int>

有効なタイプです。

ValueRange

タイプなしではありません。

ジェネリック MenuItem を実装するには、たとえば、MenuItem をテンプレート化されたクラスにするか、ValueRange をテンプレート化されていない基本クラスに拡張することができます。次に例を示します。

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

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

次に、ValueRangeBase (値ではなく) を汎用の ValueRange として使用できます。これは便利な場合もありますが、希望どおりではない場合もあります。

于 2013-06-23T15:10:22.200 に答える