0

データメンバーが32ビットの符号なし整数のみであるクラスがあります。つまり、クラスは次のようになります。

class A {
protected:
    unsigned int bits;
    /* ... some methods ... */
public:
    /* ... some methods ... */
};

ただし、32ビットの符号なし整数との間で暗黙的に変換できるようにする必要もあります。そこで、コピーコンストラクターとキャスト演算子を追加しました。

class A {
protected:
    unsigned int bits;
    /* ... some methods ... */
public:
    A(): bits(0) {} // default constructor
    A(const unsigned int i): bits(i) {} // convert from unsigned int to A
    operator unsigned int() { return bits; } // convert from A to unsigned int
    /* ... some methods ... */
};

たとえば、次のことができます。

int main () {
    // default constructor
    A a0 = A();
    // convert from unsigned int
    A a1 = 1 + 2;
    // conversions between the two types:
    unsigned int result = (a0 & a1 + 5) / 2;
}

しかし、私はそれを型で動作させるのに苦労していconstます。特に、以下は機能しません。

int main () {
    const A a = 5;      // works
    unsigned int i = a; // compiletime error
}

「'constA'から'unsignedint'への適切な変換関数は存在しません。」と書かれています。マイクロソフトが提供するデフォルトのコンパイラでVisualStudio2010を使用しています。

正しく機能させるには、どのような変換関数を作成する必要がありますか?

4

1 に答える 1

3

変換演算子 const を宣言します。

operator unsigned int() const { return bits; }

警告: 暗黙的な変換演算子は、ほとんどの場合、悪い考えです。通常、危険性は、単純な古いメンバー関数を呼び出すことの小さな不便さをはるかに上回ります。

unsigned int asInt() const { return bits; }
⋮
unsigned int i = a.asInt();

C++11 を使用している場合の最終的な解決策は、明示的な変換演算子を宣言することです。

explicit operator unsigned int() const { return bits; }
⋮
unsigned int i = static_cast<int>(a);
于 2012-04-08T03:48:39.757 に答える