2010-08-04 6 views
2
template <typename T> void function(T arg1, 
    T min = std::numeric_limits<T>::min(), 
    T max = std::numeric_limits<T>::max()) 
{ 
} 

template <> void function<int>(int arg1, int min,int max) 
{ 
} 

int main(int argc,char* argv[]) 
{ 
    function<int>(1); 
} 

:: 토큰의 함수 기본 인수 행에서 구문 오류 C2689 및 C2059를 제공합니다. 하지만 전문화하지 않고 잘하고 있습니다. 나는 기본 인수 을 변경하고 여전히 전문화하고있는 경우 : 너무 사라템플릿 함수 특수화 기본 인수

template <typename T> void function(T arg1, 
    T min = T(0), 
    T max = T(1)) 
{ 
} 
template <> void function<int>(int arg1, int min,int max) 
{ 
} 

문제를.

또는 function<float>(1.0f) 괜찮 으면 템플릿 기능이 특수화 된 경우 전화 할 때 기본 인수를 다시 작성해야합니다.

std::numeric_limits<T>::..으로 바꾸고 두 번째 경우 T(..)으로 바꾸고 function<int>(1)을 호출 할 때 이유가 무엇입니까? 원래의 문제로

(I'am 사용하여 비주얼 스튜디오 2010의 x64)

는 버그, 문제는 지금 로 변경하기 때문에 그것을 어떻게 해결하는 것입니다?

답변

3

코드에 아무런 문제가 없습니다. Comeau Online, Intel C++ 11.1 및 g ++ 4.1.2가 성공적으로 컴파일됩니다.

저는 그것이 컴파일러의 버그라고 생각합니다. 최근에 Visual C++ 2010 컴파일러와 관련하여 약간 다른 bug report을 제출했습니다.

template <typename T> 
T get_limits_min() { return std::numeric_limits<T>::min(); } 

template <typename T> 
T get_limits_max() { return std::numeric_limits<T>::max(); } 

template <typename T> void function(T arg1, 
    T min = get_limits_min<T>(), 
    T max = get_limits_max<T>()) 
{ 
} 

미운 :

해결 방법으로

, 당신은 전화를 포장 할 수 있습니까? 아주.


가 나는 기본 인수 값이 매개 변수가 있어야합니다 the bug you reported on Microsoft Connect:

의 기본 템플릿에 대한 응답으로 다음과 같은 기록했다. 기본 인수 값은 전역 이름 공간이 아닌 클래스 템플릿의 멤버 함수 여야합니다.

namespace N 
{ 
    template <typename T> 
    struct S 
    { 
     static T g() { return T(); } 
    }; 
} 

template <typename T> void f(T = N::S<T>::g()) { } 

template <> void f<>(int) { } 

int main() 
{ 
    f<int>(); 
} 

컴파일러는 다음과 같은 오류가 방출, 모두 기본 템플릿을 정의 라인에 :

다음

최소한의 코드를 재현하는 것입니다 흥미롭게

error C2589: '::' : illegal token on right side of '::' 
error C2059: syntax error : '::' 

, 또 다른 문제가 있습니다 클래스 템플릿이 전역 이름 공간에있는 경우

이 두 가지 예를 들어, 테스트 케이스
error C2064: term does not evaluate to a function taking 0 arguments 

가 잘 형성 C++ 프로그램입니다 :

template <typename T> 
struct S 
{ 
    static T g() { return T(); } 
}; 

template <typename T> void f(T = ::S<T>::g()) { } 

template <> void f<>(int) { } 

int main() 
{ 
    f<int>(); 
} 

컴파일러는 기본 템플릿이 정의 된 라인에 다음과 같은 오류가 방출 : 다음 코드를 감안할 때.

+0

어떻게이 버그를 Microsoft에 신고합니까? – uray

+0

@uray : 나열된 버그 보고서 링크를 통해 connect.microsoft.com에 제출할 수 있습니다. 로그인하여 새 결함을 열어야합니다. 원하지 않으시면이 문제와 이전에 공동 샘플로보고 한 문제를 줄이고 문제를 다시 제출하도록 노력하겠습니다. 알려주세요. 기꺼이 도와 드리겠습니다. –

+0

지금 버그를보고하고 있습니다. – uray

1

https://stackoverflow.com/a/13566433/364084https://stackoverflow.com/a/27443191/364084에서 대답하는 것처럼 이것은 Windows 헤더에 정의 된 최소 및 최대 매크로 때문입니다. 다음 코드는 매크로 확장을 방지하여 작동해야합니다.

template <typename T> void function(T arg1, 
    T min = (std::numeric_limits<T>::min)(), 
    T max = (std::numeric_limits<T>::max)()) 
{ 
} 

template <> void function<int>(int arg1, int min,int max) 
{ 
} 

int main(int argc,char* argv[]) 
{ 
    function<int>(1); 
} 
관련 문제