c – 解决编译器错误
发布时间:2020-12-16 07:03:53 所属栏目:百科 来源:网络整理
导读:我有大计算几何库.它的内核存在问题.我们有定义标量taits和自由函数形式的辅助加速器,只需编写cg :: epsilon T()而不是cg :: scalar_traits T :: epsilon.但是在vs2008和vs2010下它有时会争辩说它无法在cg :: epsilon T中推断出T的模板参数的问题.在LWS的其
我有大计算几何库.它的内核存在问题.我们有定义标量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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |