1

多数のユニオン クラス (union_a、union_b、...) があり、すべて同じデータ メンバーと異なるメンバー関数を持ちます。任意のクラスのオブジェクトを他のクラスのオブジェクトに割り当て、それを init の任意の ctor で使用できるようにしたいと考えています。「作業」共用体 union_z がメディエーターとして使用されます。VC ではすべて正常に動作します。GC では、最後の行に「エラー: 'union_a' から非スカラー型 'union_b' への変換が要求されました」が表示されます。

できれば助けてください、私は...

union union_z{int m;};

union union_a{
    int  m;

    union_a(){}
    union_a(union_z x){m = x.m;}

    void operator=(union_z x){m = x.m;}
    operator union_z(){return *(union_z *)this;}
};

union union_b{
    int  m;

    union_b(){}
    union_b(union_z x){m = x.m;}

    void operator=(union_z x){m = x.m;}
    operator union_z(){return *(union_z *)this;}
};

union_a  a;
union_b  b(a);
b = a;
union_b  b1 = a; //error: conversion from ‘union_a’ to non-scalar type ‘union_b’ requested
4

1 に答える 1

4

G++ が正しいです。コピー初期化の正式な構文は、式の右側を=対象の型に変換してからコピーすることです。union_aこの場合、 からへの暗黙的な変換を想定していunion_bます。そして、1つもありません。唯一の変換には 2 つのユーザー定義変換が必要であり、2 つのユーザー定義変換を暗黙的な変換で使用することはできません。

§8.5/16 および §13.3.1.4 を参照してください (C++11、ただし、これに関する規則は以前のバージョンに関して変更されていません)。

于 2013-04-24T17:38:53.877 に答える