2012-11-17 13 views
10

C++ 11標準でテンプレート化された共用体について何か言いますか? (私はhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdfで何かを見つけることができませんが、私は慎重にそれを読んでいない。)C++でテンプレート化された共用体11

私はこのコードは(error: expected primary-expression before ‘.’ tokenを言ってerror: a designator into a template-dependent type is not allowedg++ -std=c++0xを言ってicpc -std=c++11を引き起こし、g++ -std=c++11

template<typename T> 
union u { 
    T a; 
    char b; 
}; 

template<typename T> 
u<T> make_u(T t) { 
    return { .a = t }; 
} 

int main() { 
    return make_u<int>(1).a; 
} 

を持っていますバージョン4.8.0(実験的))はinternal compiler error: in lookup_field_1, at cp/search.c:387と言います。 { .a = t }tに置き換えてこの問題を回避できます。しかし、私は組合の最初のメンバーではないフィールドではこれを行うことができませんでした。関連するメンバがテンプレートに依存するテンプレート化された共用体で、最初のメンバ以外のメンバを選択する方法はありますか? (私はもちろん、スタック上に組合を宣言し、メンバーを私が望む値に設定することもできますが、イニシャライザリストやconstexpr関数ではできませんでした)

+0

テンプレート化された共用体に関する一般的な質問:http://stackoverflow.com/q/20743582/1147772 – Drax

答えて

13

{ .a = t }構文は次のとおりです非標準GNU拡張であるため、他のC++機能との相互作用はC++標準の範囲外です。

ソリューション:

u<T> make_u(T t) { 
    u<T> r; 
    r.a = t; 
    return r; 
} 

EDIT:標準C++を書く私の知る限り、C++ 11には、あなたの労働組合に必要な初期化を行い、コンストラクタ(必要であればconstexprの)を与えることができます。例:http://ideone.com/s4GHjU

関連する問題