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’

条件演算子が暗黙的に floatbの型に変換されることを期待しています。a-0.5しかし、これは起こりません。この暗黙のキャストを実現するにはどうすればよいですか?

理想的には、静的キャストや のようなアクセサー メソッドは避けたいと思いfloat MyFloat::getValue()ます。

4

3 に答える 3

8

問題は、2 つの変換があることです。コンパイラは に変換a-0.5するMyFloatか、または に変換できbますfloat。両方の変換があり、どちらもマークされていない限り、explicitこの種のあいまいさが常に発生します。

于 2013-02-06T21:47:31.550 に答える
1

一部の変換のみが行われます。http://msdn.microsoft.com/en-us/library/e4213hs1(v=vs.71).aspxから

最初のオペランドは、整数型またはポインター型でなければなりません。2 番目と 3 番目の式には、次の規則が適用されます。

  • 両方の式が同じ型の場合、結果はその型になります。
  • 両方の式が算術型または列挙型の場合、通常の算術変換 (算術変換で説明) が実行されて、それらが共通の型に変換されます。
  • 両方の式がポインター型である場合、または一方がポインター型で、もう一方が 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 に答える