2012-11-17 12 views
10

क्या सी ++ 11 मानक टेम्पलेटेड यूनियनों के बारे में कुछ भी कहता है? (मैं http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf में कुछ भी नहीं मिल सकता है, लेकिन मैं यह है कि ध्यान से नहीं पढ़ा है।)सी ++ में टेम्पलेटेड यूनियन 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++11 का कारण बनता है error: a designator into a template-dependent type is not allowed, g++ -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 के साथ बदलकर इसे प्राप्त कर सकता हूं। हालांकि, मैं उन क्षेत्रों के लिए ऐसा नहीं कर सका जो संघ के पहले सदस्य नहीं हैं। क्या टेम्पलेट यूनियन में पहले व्यक्ति के अलावा कुछ सदस्य चुनने का कोई तरीका है, जहां प्रासंगिक सदस्य टेम्पलेट-निर्भर है? (मैं निश्चित रूप से, स्टैक पर एक संघ घोषित कर सकता हूं, और सदस्य को इच्छित मूल्य के बराबर सेट कर सकता हूं। लेकिन मैं इसे प्रारंभकर्ता सूची में या constexpr फ़ंक्शन में नहीं कर सका।)

+0

टेम्पलेटेड यूनियन पर सामान्य प्रश्न: http://stackoverflow.com/q/20743582/1147772 – Drax

उत्तर

13

{ .a = t } वाक्यविन्यास है एक गैर-मानक जीएनयू एक्सटेंशन, इसलिए अन्य सी ++ सुविधाओं के साथ इसकी बातचीत सी ++ मानक के दायरे से बाहर है।

समाधान: मानक सी लिखने ++:

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

संपादित करें: AFAIK, सी ++ 11 में, आप अपने संघ एक निर्माता (एक constexpr यदि आप चाहें तो) कि प्रारंभ आप की आवश्यकता है दे सकते हैं। उदाहरण: http://ideone.com/s4GHjU