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
}

它说“不存在从 'const A' 到 'unsigned int' 的合适转换函数。”。我将 Visual Studio 2010 与 Microsoft 提供的默认编译器一起使用。

我需要创建什么转换函数才能使其正常工作?

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 回答