2013-03-20 3 views
4

큰 계산 기하 라이브러리가 있습니다. 커널에 문제가 있습니다. 우리는 scalar taits와 helper accesors를 자유 함수의 형태로 정의하여 cg::scalar_traits<T>::epsilon 대신에 cg::epsilon<T>()을 쓰도록 정의했습니다. 그러나 vs2008 및 vs2010에서 가끔 cg::epsilon<T>T의 템플릿 매개 변수를 추론 할 수 없다고 주장하는 문제가 있습니다. LWS의 다른 컴파일러에서는 잘 작동합니다.컴파일러 버그 해결

감소 버전은 재현 : 접근 작동하게하는 몇 가지 해결 방법

namespace cg 
{ 

template<class S> 
S epsilon(); 

template<> 
double epsilon<double>() {return 1;} 
template<> 
float epsilon<float>() {return 1;} 

template<class S> 
bool eq(S a, S b, S eps = cg::epsilon<S>()) 
{ 
    return true; 
} 

} 


int main(int argc, char* argv[]) 
{ 
    cg::eq(0.0, 0.0); 
    cg::eq(0.0f, 0.0f); 
    return 0; 
} 

이 있습니까?

PS : 오류가 발생하는 경우, 도움 우리는 cg::scalar_traits<S>::epsilon()를 사용하지만 너무 자세한

연구 : 컴파일러는 그 CG에 대한 S를 추론 할 수 없다고 불평

template<class S> 
bool eq(S a, S b, S eps = cg::epsilon<double>()) 

로 심지어 declarated : : 엡실론.

답변

1

내 생각 엔 컴파일러가 공제에 기본 매개 변수 S eps = cg::epsilon<S>()을 사용하고있는 것 같습니다. 이를 위해서는 cg::epsilon<S>()의 선언을 살펴야하지만 현재로서는 S을 알지 못합니다.

해결 방법은 세번째 파라미터에 대한 기본값을 방지하고 두 개의 다른 오버로드를 추가한다 : 첫 번째 세 개의 인자 (a, beps)를 취하고 상기 제 단지 2 (ab)에 걸린다.

template<class S> 
bool eq(S a, S b, S eps) 
{ 
    return true; 
} 

template<class S> 
bool eq(S a, S b) 
{ 
    S eps = cg::epsilon<S>(); 
    return eq(a, b, eps); 
} 
+0

당신의 추측은 사실적인 사운드 : 후자는 cg::epsilon<S>()에서 아래의 코드와 이전에 호출을 보여줍니다 위임 (이 S가 이미 도출 된 시간에) eps을 가져옵니다. 그러나 래퍼를 쓰는 것은'cg :: scalar_traits :: epsilon'을 사용하는 것보다 나쁩니다. 또한 당신이 옳다면, 형질을 사용하는 것이 왜 그 오류를 유발하지 않는가? – kassak

+0

연구 섹션에서 업데이트를 살펴보십시오. 그것은 매우 이상합니다. – kassak

+0

@kassak : 래퍼를 쓰지 않고 기본 매개 변수를 사용하는 것을 선호합니다 (코드가 표준을 준수한다고 생각합니다). 래퍼를 작성하는 것은 원치 않는 해결 방법입니다 .- ("특성을 사용하면 오류가 발생하지 않습니다"라는 의미는 이해할 수 없지만 Visual Studio의 코드를 볼 수 없기 때문에 어쨌든 정확히 무슨 일이 일어나는지 알 수 없습니다. ;-) 나는 단지 추측 할 수있다. –

관련 문제