我有很大的计算几何库。它的内核有问题。我们有定义标量 taits 和自由函数形式的辅助访问器,可以简单地编写cg::epsilon<T>()
而不是cg::scalar_traits<T>::epsilon
. 但是在 vs2008 和 vs2010 下有时会争辩说它无法为T
in推导出模板参数的问题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>())
编译器抱怨他无法为 cg::epsilon 推导出 S。