0

私はしばらく奇妙なエラーに苦しんでおり、あなたの助けが必要です:D

次のように宣言された「Image」クラスがあります

template <typename P>
class Image {
// ...
public: // Operators 
    Color<P>*& operator [] ( unsigned int const& i );
// ...
}

この演算子をオーバーロードするのは初めてなので、よくわかりません (特に *& の部分...)

次のようなことを試してみると、トラブルが表示されます。

/// Sample Code
Image<P> img; img[0][0] = Color<double>(1.0, 1.0, 1.0);

私は得る

./src/Graphics/PNGWriter.cc:12:3: error: no match for ‘operator[]’ in ‘img[0]’
./src/Graphics/Image.cc:24:12: note: candidate is: Color<P>*& Image<P>::operator[](const unsigned int&) [with P = double] <near match>

明らかに、もう少しわかりにくいことが私にとっての解決策です...

何か案が ?

ありがとう !

4

2 に答える 2

0

まず第一に、参照によってそれほど多くのものを渡す必要はありません。unsigned intを値で取得しても、ほぼ確実に速度が低下することはありません。ポインタへの参照についても同じです。

これは問題かもしれませんが、私はそれを疑っています。0がに変換されない理由がわかりませんunsigned int const&。もう1つの可能性は、画像が実際constにあるということですが、貼り付けでそれについて言及していません。添え字演算子は通常、ペアで提供されます。別のものをとして宣言する必要がありますColor<P> const* operator [] ( unsigned int i ) const;

img[0]それが不平を言っていることに注意してください、それで= Color<double>(1.0, 1.0, 1.0);おそらく問題ではありません(私が見逃しているいくつかのSFINAEエラーがない限り)。Image最後に、に特化していないことを確認してくださいdouble

編集:ちなみに、戻ることColor<P>*&には深刻な欠点があります。誰かができることはimg[0] = 0、おそらくクラスが使用されることを意図した方法ではありませんでした。

于 2011-11-04T02:37:50.803 に答える
0

すべての「「...」に一致しない」エラーは、呼び出しの引数が関数または演算子の宣言された引数と互換性がないことを意味するため、引数の宣言を確認する必要があります。operator[]unsigned intへの引数を作成します。同様に、返されたポインタを参照渡しするのは非常に奇妙です。必ずしも悪いわけではありませんが、非常に疑わしいです。一般に、非複合型は値渡しする必要があります。

于 2011-11-04T00:54:55.950 に答える