c – 解决编译器错误

c – 解决编译器错误,第1张

概述我有大计算几何库.它的内核存在问题.我们有定义标量taits和自由函数形式的辅助加速,只需编写cg :: epsilon< T>()而不是cg :: scalar_traits< T> :: epsilon.但是在vs2008和vs2010下它有时会争辩说它无法在cg :: epsilon< T>中推断出T的模板参数的问题.在LWS的其他编译器工作正常. 减少版本重现: namespace cg 我有大计算几何库.它的内核存在问题.我们有定义标量taits和自由函数形式的辅助加速,只需编写cg :: epsilon< T>()而不是cg :: scalar_traits< T> :: epsilon.但是在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(),这有助于发生错误,但是太多冗长

研究:
甚至声明为

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

编译器抱怨他无法推断出cg :: epsilon的S.

解决方法 我的猜测是编译器在S的推导中使用默认参数S eps = cg :: epsilon< S>().为此,它需要查看cg :: epsilon< S>()的声明但是此时它还不知道S.

解决方法是避免第三个参数的默认值并添加两个不同的重载:第一个采用三个参数(a,b和eps),第二个采用两个参数(a和b).后者从cg :: epsilon< S>()得到eps(此时已经推断出S)并将调用委托给前者,如下面的代码所示:

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

以上是内存溢出为你收集整理的c – 解决编译器错误全部内容,希望文章能够帮你解决c – 解决编译器错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1226593.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存