2012-11-17 6 views
10

C++ 11 standardı şablonlu sendikalar hakkında bir şey söyler mi? ((Ben http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf şey bulamıyorum, ama o dikkatle okumadım.)Temperlenmiş sendikalar C++ 11

Ben

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; 
} 

Bu kod error: a designator into a template-dependent type is not allowed, g++ -std=c++0xerror: expected primary-expression before ‘.’ token söylemek söylemek icpc -std=c++11 neden var ve g++ -std=c++11 versiyon 4.8.0 (deneysel)) demek internal compiler error: in lookup_field_1, at cp/search.c:387. { .a = t }'u t ile değiştirerek bunu başarabilirim. Bununla birlikte, sendikanın ilk üyesi olmayan alanlar için bunu yapamam. İlgili üyenin şablona bağımlı olduğu, templated bir birleşimdeki ilkinden başka bir üye seçmenin bir yolu var mı? (Tabii ki, yığın üzerinde bir birlik bildirebilir ve üye istediğim değere eşit olabilir. Ama bunu bir başlatıcı listesinde veya bir constexpr işlevinde gerçekleştiremedim.)

+0

Şablonlu birleşim hakkında genel soru: http://stackoverflow.com/q/20743582/1147772 – Drax

cevap

13

{ .a = t } sözdizimi standart olmayan bir GNU uzantısı, diğer C++ özellikleriyle etkileşimi C++ standardının kapsamı dışındadır.

Çözüm: ++ standart C yazma:

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

DÜZENLEME: AFAIK, C++ 11, kendi Birliğe tam ihtiyacınız başlatma yapar Yapıcı (constexpr isterseniz) verebilir. Örnek: http://ideone.com/s4GHjU