0

次の Enum 定義があります。

typedef enum MyEnumBase
{
  VALUE0 = 0,
  VALUE1,
  VALUE2,
  VALUE3
} MyEnum;

私のクラスは、この列挙型を次のように使用します。

class MyClass {
public:
  MyClass (MyEnum initvalue) {enum1 = initvalue;};
  operator bool() {return (VALUE0 == enum1);};
  operator MyEnum() {return (enum1);};
private:
  MyEnum enum1;
};

主な機能で:

int main(int agrc, char *argv[])
{
  MyClass class1 = VALUE2;

  bool OK = (VALUE0 == class1);

  return 0;
}

MS VC++ 2010 では正常にコンパイルされますが、Borland XE2 および XE3 では次のように表示されます。

[bcc32 Error] test.cpp(26): E2015 Ambiguity between 'operator MyClass::bool()' and 'operator MyClass::MyEnumBase()'

あいまいかもしれませんが、一方で左側の引数は MyEnum 型であり、クラスのブールキャストではなく列挙型キャストを作成するのは簡単です。(Visual Studio と同様)

引数を交換しても (class1 == VALUE0)、問題は解決しません。

行を次のように変更できます。

bool OK = (VALUE0 == (MyEnum)class1);

そしてそれはコンパイルされますが、その場合、巨大なプロジェクト全体を調べて、クラスのすべての使用を「修正」する必要があります-これは「エラー変数」であるため、あまり良い考えではありません。

これをコンパイルするもっと洗練された方法があるはずです。誰にもアイデアがありますか?

4

3 に答える 3

1

変換演算子と非 (!) の明示的なコンストラクターが同じ型を取ることは避けてください! 明示的な MyClass (MyEnum initvalue) enum1(initvalue) {} で修正する必要があります。

于 2013-08-09T12:53:15.507 に答える
0

tebe に代わって回答:
私にとってより明確な決定的な回答を投稿できないため、ここに私の考えを投稿します。

operator ==解決策は、MyEnum および MyClass 引数のグローバルをオーバーロードすることです。

于 2014-05-16T13:41:18.597 に答える