2013-02-11 5 views
1

다음 코드 비트는 GCC 4.5.3에서 컴파일되지만 VS 2008 및 2010에서는 컴파일되지 않습니다. VS 컴파일러 버그 때문입니까? 아니면 표준에서 기본 함수 템플릿 인수 값을 제공하는 것을 금지합니까?멤버 함수 템플릿 인수 기본값

#include <cstdlib> 

struct Bar 
{ 
    enum Group{ A , B , C }; 
}; 

struct Foo 
{ 
    template<typename T> 
    static void getSome(typename T::Group = T::A); 
}; 

template<typename T> 
void Foo::getSome(typename T::Group) 
{ 
}; 

int main() 
{ 
    Foo::getSome<Bar>();   // Does not compile in VS 2008 & 2010 (compiles in gcc 4.5.3) 
    Foo::getSome<Bar>(Bar::C); // Compiles in VS 2008 and gcc 4.5.3 
    return EXIT_SUCCESS; 
} 

오류 메시지

prog.cpp(11) : error C2589: '::' : illegal token on right side of '::' 
prog.cpp(11) : error C2059: syntax error : '::' 

답변

6

그것은 MSVC의 버그입니다.

짐작 하시겠지만 버그는 기본 매개 변수가있는 템플릿 함수를 처리하는 중입니다.

해결 방법은 모든 기능 매개 변수를 제공하는 것입니다. ())

인정 됨 here.

+0

또 다른 절름 거리는 방법은 템플릿 매개 변수의 오버로드 즉, getSome()을 제공하여 getSome (T :: A)를 호출하는 것만으로 기본 매개 변수를 제공하는 것입니다. MSVC에서도 작동합니다. –

3

g++은 스 니펫을 컴파일 할 때 표준을 고수하고 있습니다.

다음 추출물 표준의 오른쪽 부분 참조이어야한다 (섹션 14.1.9은)

기본 템플릿 인수 템플릿 인수 인 (14.3)가있는 = 후에 지정된 템플릿 매개 변수. 기본 템플릿 인수는 템플릿 매개 변수 팩 (14.5.3)이 아닌 모든 종류의 템플릿 매개 변수 (유형, 비 유형, 템플릿)에 대해 으로 지정 될 수 있습니다. 디폴트 template-argument가 템플릿 선언에 지정 될 수 있습니다. 기본 템플릿 인수는 구성원 클래스 외부에 나타나는 클래스 템플릿 구성원의 템플릿 매개 변수 목록 템플릿에 지정되어서는 안됩니다. 기본 템플릿 인수는 친구 클래스 템플릿 선언에 지정되어서는 안됩니다. friend 함수 템플릿 선언에 기본 템플릿 - 인수가 지정되어있는 경우 해당 선언은 정의이고 은 번역 단위의 함수 템플릿에 대한 유일한 선언이어야합니다.