2012-11-17 45 views
10

Tiêu chuẩn C++ 11 có nói gì về các công đoàn khuôn mẫu không? (Tôi không thể tìm thấy bất cứ điều gì trong http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf, nhưng tôi đã không đọc nó một cách cẩn thận.)Công đoàn phù hợp trong C++ 11

Tôi có

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

Mã này gây icpc -std=c++11 nói error: a designator into a template-dependent type is not allowed, g++ -std=c++0x nói error: expected primary-expression before ‘.’ token, và g++ -std=c++11 (phiên bản 4.8.0 (thử nghiệm)) để nói internal compiler error: in lookup_field_1, at cp/search.c:387. Tôi có thể giải quyết vấn đề này bằng cách thay thế { .a = t } bằng t. Tuy nhiên, tôi không thể làm điều này cho các lĩnh vực mà không phải là thành viên đầu tiên của công đoàn. Có cách nào để chọn một số thành viên khác không phải là thành viên đầu tiên trong một liên minh có khuôn mẫu, nơi mà thành viên có liên quan phụ thuộc vào mẫu không? (Tôi có thể, tất nhiên, tuyên bố một công đoàn trên ngăn xếp, và thiết lập các thành viên bằng giá trị tôi muốn. Nhưng tôi không thể làm điều này trong một danh sách khởi tạo hoặc trong một hàm constexpr.)

+0

Câu hỏi chung về công đoàn khuôn mẫu: http://stackoverflow.com/q/20743582/1147772 – Drax

Trả lời

13

Cú pháp { .a = t } một phần mở rộng GNU không chuẩn, vì vậy sự tương tác của nó với các tính năng C++ khác nằm ngoài phạm vi của tiêu chuẩn C++.

Giải pháp: viết chuẩn C++:

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

EDIT: AFAIK, trong C++ 11, bạn có thể cho công đoàn của bạn một constructor (một constexpr nếu bạn thích) mà không được khởi tạo nào bạn cần. Ví dụ: http://ideone.com/s4GHjU

Các vấn đề liên quan