我有很大的计算几何库。它的内核有问题。我们有定义标量 taits 和自由函数形式的辅助访问器,以简单地编写 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>())
编译器提示他无法为 cg::epsilon 推导出 S。
最佳答案
我的猜测是编译器在 S eps = cg::epsilon<S>()
的推导中使用了默认参数 S
。为此,它需要查看 cg::epsilon<S>()
的声明,但此时它还不知道 S
。
解决方法是避免第三个参数的默认值并添加两个不同的重载:第一个采用三个参数( a
、 b
和 eps
),第二个仅采用两个( a
和 b
)。后者从 eps
中获取 cg::epsilon<S>()
(此时 S
已经推导出来)并将调用委托(delegate)给前者,如下代码所示:
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);
}
关于c++ - 解决编译器错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15520497/