2010-03-18 2 views
14
void foo() { 
    struct Foo { .. }; 
    std::vector<Foo> vec; // why is this illegal? 
} 

나는 Foo를 바깥 세상으로 돌려 보내지 않을 것입니다. 함수 내에서 사용하는 것은 단지 임시 유형입니다.std :: vector가 로컬 형식을 사용할 수없는 이유는 무엇입니까?

+0

+1 좋은 질문입니다! === – SadSido

+0

@anon : 어떤 컴파일러를 사용했는지 알 수 있습니까? – jasonline

+0

@anon : Visual C++ 2005에서 컴파일 할 수 있지만 실제로 언급 된 경우 표준을 따르지 않습니다. – jasonline

답변

14

로컬 클래스는 템플릿 인수가 될 수 없습니다. 표준 말한다 때문에 -

14.3.1 제 2 항 : "A 지역의 유형, 아니 연계와 유형, 익명의 유형 또는 이러한 유형의에서 복합 유형 는 템플릿 인수로 사용할 수 없다 템플릿 유형 매개 변수. "

[Example: 
template <class T> class X { /* ... */ }; 
void f() 
{ 
struct S { /* ... */ }; 
X<S> x3; // error: local type used as templateargument 
X<S*> x4; // error: pointer to local type used as templateargument 
} 
-end example] [Note: a template type argument may be an incomplete 
type (3.9). ]" 

해결 방법 중 하나는 c.l.C++. moderated에 here입니다.

업데이트 : 왜 로컬 클래스를 템플릿 인수로 사용할 수 없는지에 대한 논의가 있었습니까? c.std.C++에있는 herehere 링크는 동일한 내용을 설명합니다.

3

짧은 답변 : 은 C++의 표준 그렇게 말한다하기 때문에 (섹션 14.3.1)

긴 답 : C++ 표준화 된 시점에 은 C++ 표준위원회는 구현 및 성능이있을 것이라고 믿었다 문제. 그러한 두려움은 근거가 없다는 것이 드러났으며 C++ 0x 표준의 최종 초안에서 결정을 취소했습니다.

보다 실제 노트에

, 어떤 컴파일러는 이미 새로운 C++ 0X 규칙을 지원 : 당신이해야합니다에서라도 들어

  • GCC -std=c++0x 명령 줄 매개 변수와> = 4.5 당신이> = VC8/VS2005 /Za 옵션 (해제 언어 확장)없이
가 필요합니다 마이크로 소프트 컴파일러
  • 관련 문제