2011-01-11 5 views
4

내부의 범위. 내가 GCC를 시도 할 때, 내가 얻을 :사용하여 템플릿의 내가 다음 코드가 있다고 가정 해 봅시다 기능

foo 세계적 범위가 그 유형이 이름이
$ g++ --version # just in case this matters 
g++ (Debian 4.4.5-8) 4.4.5 
... 
$ g++ foo.cc 
foo.cc: In function 'void g()': 
foo.cc:7: error: no matching function for call to 'f(g()::<anonymous struct>&)' 

이 작동합니다. 그러나 형식이 익명 인 경우 또는 안에 g()으로 선언되어 있지 않습니다.

왜 GCC에서이를 거부합니까? C++이 유효합니까?

답변

7

14.3.1 절 2 :

로컬 입력없이 결합, 무명 형 또는 이들 형태의 하나에서 복합 타입 와 유형 템플릿 typeparameter위한 templateargument으로 사용할 수 없다.

즉, 유효하지 않습니다. 그것은 유용 할 것이지만 그것이 아마도 VC가 허용하는 이유 일 것입니다.

+2

실망 스럽습니다. 이것은 예를 들어 C++의 클로저 부족에 대한 실행 가능한 대안이었을 것입니다. –

+1

그런 간단한 답변에 감사드립니다. 나에게이 사용법은 언어의 "정신"에 맞는 것처럼 보이지만 구현자가 약간의 번거 로움을 덜어주기 위해 이것이 왜 범위가 지정되었는지도 알 수 있습니다. – asveikau

+1

. 그것은 끔찍한 하나의 구조체로 전역 또는 다른 네임 스페이스를 혼란스럽게 만들 수 있습니다. 단지 하나의 함수로 한번만 사용하면됩니다. – stijn

관련 문제