2012-11-17 3 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; 
} 

이 코드는 error: a designator into a template-dependent type is not allowed, g++ -std=c++0xerror: expected primary-expression before ‘.’ token 말을 말을 icpc -std=c++11 원인이 있고, g++ -std=c++11 버전 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++ 표준의 범위를 벗어납니다.

솔루션 : ++ 표준 C 쓰기 :

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

편집 : AFAIK, C++ 11, 당신은 당신의 노동 조합에게 필요한 초기화를 수행 생성자 (A constexpr 당신이 좋아하는 경우)을 제공 할 수 있습니다. 예 : http://ideone.com/s4GHjU

관련 문제