1

次のコンストラクターを持つ 2 つのテンプレート引数を持つテンプレート クラスがあります。

template <class T, class TCompare>
class MyClass {
...
public:
MyClass(TCompare compare);
...
};

そして、整数比較のために operator () をオーバーロードする構造があります。

struct IntegerLess {
    bool operator () {const int& a, const int& b) {
       if (a < b)
           return true;
       return false;
    }
};

この構造体を引数として MyClass コンストラクターに渡したいと思います。私は次のことを試しました:

MyClass<int> myClassObject(IntegerLess());

MyClass<int, typename IntegerLess> myClassObject(IntegerLess());

ただし、どちらの場合もコンパイル時エラーが発生します。最初のケースでは

error: wrong number of template arguments (1, should be 2)

そして2番目のケースでは

error: template argument 2 is invalid

誰かがここで正しいオプションを指摘できますか? ありがとう!

4

1 に答える 1

2

番号 1 は間違っています。クラス テンプレートの引数を推測できないためです。明示的に指定する必要があります (クラス テンプレートの定義にデフォルト値がない限り)。

typename2番には、そこにあってはならない余分なものがあります。正しい構文は次のとおりです。

MyClass<int, IntegerLess> myClassObject(IntegerLess());

IntegerLess実際のコードであり、質問を単純化するために作成したモックではない場合は、std::less<int>代わりに使用することを検討してください。これは、クラスが行うこととまったく同じです。次のように、それをクラスのデフォルトのテンプレート引数にすることもできます。

テンプレート > クラス MyClass { public: 明示的な MyClass(TCompare 比較 = TCompare()); // ... 残りは前と同じ };

これを行うと、簡略化された形式で使用できるようになります。

MyClass<int> myClassObject;
于 2013-10-31T09:57:14.310 に答える