1

私はこのようなものを持っています:

CLASS CLASS::operator|(CLASS& right) {
    return binop(*((CLASS*) this), right, OP_OR);
}

CLASS は単なるクラスです。binopのプロトタイプは

CLASS binop(CLASS& left, CLASS& right, OP op);

これはすべて正常に動作し、Visual C++ 2010 を使用してコンパイルしますが、g++ ではエラーで失敗します。

someheader.h: In member function 'void CLASS::set(int64_t)':
someheader.h:469:29: error: no match for 'operator|' in '*(CLASS*)this | CLASS(bit)'
someheader.h:469:29: note: candidate is:
someheader.h:376:1: note: CLASS CLASS::operator|(CLASS&)
someheader.h:376:1: note:   no known conversion for argument 1 from 'CLASS' to 'CLASS&'

現在、現在のオブジェクト (*this) をパラメーターとして渡すだけで問題が発生するためconst、ポインターの修飾子を削除するために明示的にキャストアウトします。これは正常に機能し、Visual C++ コンパイラーをだましてそれを通常のポインター。g++ はこれを好まないようです。キャストを削除しても、thisconst 修飾されているためエラーが発生します。演算子の左側と右側のサイズで行うことは、両方が変更可能である必要があります。

私が収集できることから、オブジェクトを渡して関数呼び出しで参照に変換することに問題があるようです...これは私にはあまり意味がありません。助言がありますか?

4

2 に答える 2

6

Visual Studio はここで標準に違反しています。

右側の引数は一時的なものであり、C++ の規則によれば、一時的なものは非 const 参照と一致することはできません。

于 2012-04-28T05:42:23.283 に答える