큰 계산 기하 라이브러리가 있습니다. 커널에 문제가 있습니다. 우리는 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 : : 엡실론.
당신의 추측은 사실적인 사운드 : 후자는
cg::epsilon<S>()
에서 아래의 코드와 이전에 호출을 보여줍니다 위임 (이S
가 이미 도출 된 시간에)eps
을 가져옵니다. 그러나 래퍼를 쓰는 것은'cg :: scalar_traits:: epsilon'을 사용하는 것보다 나쁩니다. 또한 당신이 옳다면, 형질을 사용하는 것이 왜 그 오류를 유발하지 않는가? – kassak연구 섹션에서 업데이트를 살펴보십시오. 그것은 매우 이상합니다. – kassak
@kassak : 래퍼를 쓰지 않고 기본 매개 변수를 사용하는 것을 선호합니다 (코드가 표준을 준수한다고 생각합니다). 래퍼를 작성하는 것은 원치 않는 해결 방법입니다 .- ("특성을 사용하면 오류가 발생하지 않습니다"라는 의미는 이해할 수 없지만 Visual Studio의 코드를 볼 수 없기 때문에 어쨌든 정확히 무슨 일이 일어나는지 알 수 없습니다. ;-) 나는 단지 추측 할 수있다. –