加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读