减少版本重现:
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 – 解决编译器错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)