2012-11-17 25 views
10

C++ 11標準對模板化工會說了什麼嗎? (我找不到http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf什麼,但我沒有說仔細閱讀。)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; 
} 

此代碼會導致icpc -std=c++11error: a designator into a template-dependent type is not allowedg++ -std=c++0xerror: expected primary-expression before ‘.’ token,並g++ -std=c++11(版本4.8.0(實驗))來說internal compiler error: in lookup_field_1, at cp/search.c:387。我可以通過用t替換{ .a = t }來解決這個問題。但是,我不能爲不屬於工會第一個成員的領域做到這一點。有沒有辦法在模板聯盟中挑選除第一個成員之外的其他成員,其中相關成員是依賴於模板的? (當然,我可以在棧上聲明一個聯合,並將該成員設置爲等於我想要的值,但是我不能在初始化程序列表或constexpr函數中執行此操作。)

+0

有關模板聯合的一般問題:http://stackoverflow.com/q/20743582/1147772 – Drax

回答

13

{ .a = t }語法是一個非標準的GNU擴展,所以它與其他C++特性的交互超出了C++標準的範圍。

解決方案:編寫標準C++:

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

編輯:據我所知,在C++ 11,你可以給你的工會已經做了你所需要的初始化一個構造函數(如果你喜歡一個constexpr)。示例:http://ideone.com/s4GHjU