У нас есть большая библиотека вычислительной геометрии. Проблема в его ядре. У нас есть скалярные определения определений и вспомогательные методы доступа в виде свободных функций, чтобы просто написать cg::epsilon<T>()
вместо cg::scalar_traits<T>::epsilon
. Но проблема в том, что под vs2008 и vs2010 он иногда спорит, что не может вывести параметр шаблона для T
в cg::epsilon<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()
, это помогает там, где возникает ошибка, но это слишком многословно
Исследование: Даже заявлено как
template<class S>
bool eq(S a, S b, S eps = cg::epsilon<double>())
компилятор жалуется, что не может вывести S для cg::epsilon.