代码之家  ›  专栏  ›  技术社区  ›  Naveen

隐式类型转换-编译器错误

  •  2
  • Naveen  · 技术社区  · 15 年前

    这个问题与 this 问题。下面的代码编译了很好的VC9编译器,但是在与Comeau联机编译时给出了错误。谁能告诉我哪一个是正确的,错误的意思是什么?

    错误:不明确“?”操作:秒 转换为第三个操作数类型 “bool”,反之亦然 = (1==1) ? f():假;

    class TypesafeBool
    {
    private:
        bool m_bValue;
        struct Bool_ { 
            int m_nValue; 
        };
        typedef int Bool_::* bool_;
        inline bool_ True() const { return &Bool_::m_nValue; }
        inline bool_ False() const { return 0; }
    
    public:
        TypesafeBool( const bool bValue ) : m_bValue( bValue ){}
        operator bool_() const { return m_bValue ? True() : False(); }
    };
    
    TypesafeBool f()
    {
        return TypesafeBool(true);
    }
    
    int main()
    {
        TypesafeBool b = (1==1) ? f() : false;
    }
    
    3 回复  |  直到 9 年前
        1
  •  12
  •   Andrew Aylett    15 年前

    错误是三元运算符必须只有一个类型,而您的表达式 (1=1) ? f() : false f() 有类型 TypesafeBool false 有类型 bool . 你可以在它们之间转换,但是科莫不知道你想用哪一个。若要解决此问题,请将三元组的一面转换为另一面的类型: (1=1) ? f() : TypesafeBool(false)

    Comeau在这里是正确的,因为对于观察者来说,结果应该采用什么类型是显而易见的,但是三元表达式本身需要有一个单一的类型,而不需要参考它在什么中使用,并且它应该选择的类型是不明确的。

        2
  •  0
  •   AProgrammer    15 年前

    TypesafeBool b = (1 == 1)? f() : TypesafeBool(false);
    

    应该有用。

        3
  •  0
  •   Troubadour    15 年前

    根据@hype的评论, this article 也提出了相同的想法,但与构造函数标记 explicit . 这消除了你的歧义。

    请注意,如果您更改 b

    TypesafeBool b( (1==1) ? f() : false );
    

    = 不允许调用语法 TypesafeBool( bool ) 当它被标记为显式时(因为从技术上讲它是由两个构造函数组成的)。