0

CSクラスのテンプレートとオーバーロードされた演算子の使用法を示すプログラムを作成しようとしています。関連するコードは次のとおりです。

主要:

    ArrayTemplate<int> number(0);
            number[0] = 1;
            number[1] = 2;
            number[2] = 3;

    ArrayTemplate<string> word("na");
            word[0] = "One";
            word[1] = "Two";
            word[2] = "Three";

ヘッダ:

template<class T>
T& operator [](const int index) 
{ 
    if(index >= 0 && index < ARRAY_MAX_SIZE)
        return items[index];
    else
    {
        cerr << "INDEX OUT OF BOUNDS!!!";
        exit(1);
    }
}

問題は、オーバーロードされた添え字演算子を使用しようとすると、タイトルに示されているエラーメッセージが表示されることです。「そのような演算子「[]」はこれらのオペランドに一致しません」理由は正確にはわかりません。それは私の整数配列と私の文字列配列の両方に対してそれを行います。どんな助けでも大歓迎です。

4

2 に答える 2

6

あなたは本当にの完全な定義を示す必要がありArrayTemplateます。

これはおそらくあなたがそれをどのように見せたいかです:

template<class T>
class ArrayTemplate {
  public:

    // ...

    T& operator [](const int index) 
    { 
        if(index >= 0 && index < ARRAY_MAX_SIZE)
            return items[index];
        else
        {
            cerr << "INDEX OUT OF BOUNDS!!!";
            exit(1);
        }
    }

    // ...
};

operator[]テンプレート化されていないことに注意してください。クラスだけです。

現在のコードでは、次のようにする必要があります。

number<int>[0] = 1;
number<int>[1] = 2;
number<int>[2] = 3;

これは明らかにあなたの意図に反します。

于 2013-02-26T02:57:19.957 に答える
1
template<class T>
T& operator [](const int index) 

この宣言は、たとえばとして呼び出されobject.operator[] < type >( 5 )ます。typeテンプレート引数として提供する必要があることに注意してください。を使用して式にそのような引数を指定する方法がないため[]、演算子のオーバーロードは機能しません。

おそらくあなたはまったく欲しくないでしょうtemplate< class T >。ただそれを取り除く:

T& operator [](const int index) 

スコープ外で関数を定義すると、次のclass {}ようになります。

template<class T>
T& ArrayTemplate<T>::operator [](const int index) 

この場合、template<class T>行はクラステンプレートに戻るためにパラメータを再導入します。

于 2013-02-26T04:43:27.743 に答える