5

在 C++ 中,我试图将隐式转换与条件运算符一起使用。考虑这个例子:

class MyFloat
{ 
    public:                                                                    
        MyFloat(float val){m_val = val;}
        operator float(){return m_val;}
    protected:
        float m_val;
};

int main(int argc, char **argv)
{
    MyFloat a = 0.5f;
    MyFloat b = 1.0f;                            
    float x = true ? a-0.5f : b;
    return 0;
}

它会导致编译器错误:

error: operands to ?: have different types ‘MyFloat’ and ‘float’

我希望条件运算符隐式转换ba-0.5浮点类型。但这不会发生。我如何实现这种隐式转换?

理想情况下,我想避免静态强制转换或访问器方法,如float MyFloat::getValue().

4

3 回答 3

8

问题是有两个转换。编译器可以转换a-0.5MyFloat,也可以转换bfloat. 只要您有两种转换并且两者都没有被标记explicit,您就会一直得到这种模棱两可的情况。

于 2013-02-06T21:47:31.550 回答
1

只为您完成了一些转换。来自http://msdn.microsoft.com/en-us/library/e4213hs1(v=vs.71).aspx

第一个操作数必须是整数或指针类型。以下规则适用于第二个和第三个表达式:

  • 如果两个表达式属于同一类型,则结果属于该类型。
  • 如果两个表达式都是算术或枚举类型,则执行通常的算术转换(在算术转换中介绍)以将它们转换为通用类型。
  • 如果两个表达式都是指针类型,或者一个是指针类型而另一个是计算结果为 0 的常量表达式,则执行指针转换以将它们转换为通用类型。
  • 如果两个表达式都是引用类型,则执行引用转换以将它们转换为公共类型。
  • 如果两个表达式都是 void 类型,则公共类型是 void 类型。
  • 如果两个表达式都属于给定的类类型,则通用类型是该类类型。
于 2013-02-06T21:55:29.073 回答
0

如果我没记错的话,三元运算符不会进行任何隐式转换。你需要写

static_cast<MyFloat>(a-0.5) 

或者

static_cast<float>(b). 

回到家后,我将深入研究 C++ 标准文档以了解更多详细信息。

于 2013-02-06T21:53:36.247 回答