void foo() {
struct Foo { .. };
std::vector<Foo> vec; // why is this illegal?
}
나는 Foo를 바깥 세상으로 돌려 보내지 않을 것입니다. 함수 내에서 사용하는 것은 단지 임시 유형입니다.std :: vector가 로컬 형식을 사용할 수없는 이유는 무엇입니까?
void foo() {
struct Foo { .. };
std::vector<Foo> vec; // why is this illegal?
}
나는 Foo를 바깥 세상으로 돌려 보내지 않을 것입니다. 함수 내에서 사용하는 것은 단지 임시 유형입니다.std :: vector가 로컬 형식을 사용할 수없는 이유는 무엇입니까?
로컬 클래스는 템플릿 인수가 될 수 없습니다. 표준 말한다 때문에 -
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++에있는 here 및 here 링크는 동일한 내용을 설명합니다.
짧은 답변 : 은 C++의 표준 그렇게 말한다하기 때문에 (섹션 14.3.1
)
긴 답 : C++ 표준화 된 시점에 은 C++ 표준위원회는 구현 및 성능이있을 것이라고 믿었다 문제. 그러한 두려움은 근거가 없다는 것이 드러났으며 C++ 0x 표준의 최종 초안에서 결정을 취소했습니다.
보다 실제 노트에, 어떤 컴파일러는 이미 새로운 C++ 0X 규칙을 지원 : 당신이해야합니다에서라도 들어
-std=c++0x
명령 줄 매개 변수와> = 4.5 당신이> = VC8/VS2005 /Za
옵션 (해제 언어 확장)없이
+1 좋은 질문입니다! === – SadSido
@anon : 어떤 컴파일러를 사용했는지 알 수 있습니까? – jasonline
@anon : Visual C++ 2005에서 컴파일 할 수 있지만 실제로 언급 된 경우 표준을 따르지 않습니다. – jasonline