2016-04-03 97 views
3
class my_bool { 
    private: 
    bool value; 
    public: 
    my_bool(bool value) : value(value) {} 
    operator bool(); 

    friend my_bool operator==(const my_bool & instance_1, const my_bool & instance_2); 
}; 

void main(){ 
    my_bool a = true; 
    bool b = false; 

    if(a == b){ 
    // do something 
    } 
} 

编译器说比较运算符不明确。编译器无法决定是否应将a转换为boolb应转换为my_bool。有没有一种方法可以解决这个问题,而无需记录同一比较运算符的3个过载(my_bool,my_bool),(bool,my_bool),(my_bool,bool)?二元运算符重载;隐式类型转换

+0

不是答案,它会是一种障碍,但是你可以将你的构造函数标记为“明确的”(我不认为这是基于你的类名的好主意,因为你似乎希望隐式转换)。 – Tas

+0

我不介意将'my_bool'转换为明确的'bool'转换,即''''''''''''''''''''''''显式运算符bool();'。我希望这样解决这个模棱两可的问题,但它并没有解决任何问题(我不知道为什么) – user3600124

+0

嗯,我试过了,模糊性_does_消失了。 –

回答

0

你可以明确转换abool

if(((bool) a) == b){ // yes, this is a cast. 
     // do something 
    } 
1

卸下第二第二个参数const限定符摆脱歧义:

friend my_bool operator==(const my_bool & instance_1, my_bool & instance_2); 

http://ideone.com/30VfO1

或者使用明确的

explicit operator bool(); 

或使用不同的==重载更有意义是这样的:基于我如何解释你要使用你的类

class my_bool 
{ 
private: 
    bool value; 
public: 
    my_bool(bool value) : value(value) {} 
    operator bool() { return value; } 

    bool operator == (bool val) 
    { 
     return this->value == val; 
    } 
}; 

http://ideone.com/fBaiKp

+1

由于我的理解'operator =='应该声明为朋友函数,因为否则这种情况'bool == my_bool'会变成问题。 'explicit'这个东西解决了'operator =='的歧义问题,但是不能解决'operator &&'的问题。为什么不? – user3600124