1

私はC++の機能で自分のconstの性質によって過負荷にすることができることを知っているが、私は、コードのこの部分を実行すると、私はエラーを得た:C++の関数のオーバーロード

#include <iostream> 
#include <conio.h> 

using namespace std; 

template<class T> class Array 
{ 
public: 
    Array() : data(0), sz(0){} 
    Array(unsigned size) : sz(size), data(new T[size]){} 
    ~Array() 
    { 
     delete[] data; 
    } 

    const T& operator[](unsigned n) const 
    { 
     if(n >= sz || data == 0) 
     { 
      throw "Array subscript out of range"; 
     } 
     return data[n]; 
    } 

    T& operator[](unsigned n) 
    { 
     if(n >= sz || data == 0) 
     { 
      throw "Array subscript out of range"; 
     } 
     return data[n]; 
    } 

    operator const T*() const 
    { 
     return data; 
    } 

    operator T*() 
    { 
     return data; 
    } 

private: 
    T* data; 
    unsigned sz; 
    Array(const Array& a); 
    Array& operator=(const Array&); 
}; 

int main() 
{ 
    Array<int> IntArray(20); 

    for(int i = 0; i != 20; ++i) 
    { 
     IntArray[i] = i; 
    } 

    return 0; 
} 

エラーがIntArray[i] = i;から来て、コンパイラがそれと言います適切な過負荷機能を見つけることができません。 T& operator[](unsigned n)を呼び出すべきではありませんか?

私は私のコンパイラとして任意の助け

感謝をVS2010を使用しています。

+2

http://stackoverflow.com/questions/を参照してください3519282/why-is-ambiguity-here – fizzbuzz

答えて

4

呼び出しはあいまいですが、コードが変換を必要とするため(インデックスはintであり、あなたのoperator[]はタイプunsignedの値を期待)し、エラーメッセージが言うように、そこに複数の可能性コンバージョン(あなたがoperator T*変換演算子を提供しなかった場合、これがケースにはならないでしょう。)

エラーC2666: 'アレイ::演算子[]':4つのオーバーロードが同様の変換を持っている は可能性があり

  • [(CONSTはint *、INT)
  • 内蔵C++演算子 'のconst int型&アレイ::演算子[](unsigned int型)CONST'
  • 」&アレイ::演算子[](unsigned int型)をint型 ' '
  • '組み込みのC++演算子[(int型*、int型)'

[T = INT]

だけ変更して引数リスト '(配列、int)を' と一致しようとしたときに、 forループは、適切なオーバーロードを選択できるように、タイプunsignedのインデックスを使用します。それはこの構文を可能にするので、ポインタ型への直接変換は、通常は悪いアイデア(TM)と考えられている提供ところで

for(unsigned i = 0; i != 20; ++i) 
{ 
    IntArray[i] = i; 
} 

、:

Array<int> array(20); 
delete array; 
+0

あるいは、 'T&operator [](int n)'と 'const'バリアントにオーバーロードを追加し、' int'インデックスは変換を必要としません。これはもう少しコードですが、クラスを使用することであまり不満を感じるかもしれません。 –

+2

@MichaelBurr:確かに "ポインタへの変換"演算子を単純に削除する方が良いでしょう。 'std :: vector <>'は 'operator [](int)'を提供せず、この種の問題を引き起こさない。 –

+0

André:私はそれを買います。 –

1

いいえ、T& operator[](int n)に電話する必要があります。

これは動作します:

for(unsigned int i = 0; i != 20; ++i) 
{ 
    IntArray[i] = i; 
} 
関連する問題