c – 使用模板特化,默认参数和VS2013编译错误

c – 使用模板特化,默认参数和VS2013编译错误,第1张

概述template<typename T>void f(const T &v = T());template<>void f<std::string>(const std::string &v){ std::cout << v;}int main(int argc, char* argv[]){ f<std::string>(); // Error in VS201
template<typename T>voID f(const T &v = T());template<>voID f<std::string>(const std::string &v){    std::cout << v;}int main(int argc,char* argv[]){    f<std::string>(); // Error in VS2013,OK in VS2012,gcc-4.7    f<std::string>("Test");   // OK    f<std::string>(std::string());  //OK    return 0;}

最新的Visual Studio 2013编译器在必须使用默认参数的情况下给出以下编译器错误:

error C2440: 'default argument' : cannot convert from 'const std::string *' to 'const std::string &'Reason: cannot convert from 'const std::string *' to 'const std::string'No constructor Could take the source type,or constructor overload resolution was ambiguous

Visual Studio 2012和gcc-4.7编译正常.

更新:因为它似乎是一个VS2013错误,是否有任何临时解决方法,在MS修复此问题之前不需要进行大量代码更改?错误报告已在MS connect上提交.

解决方法 每当我看到模板功能出现这种问题时,我都会尝试切换到模板结构(如果需要临时解决方法)……

template<typename T>struct foo{  static voID f(const T &v = T());};template<>struct foo<std::string>{  static voID f(const std::string &v = std::string())  {    std::cout << v;  }};

不幸的是,我无法在Visual Studio 2013中检查这个,因为我没有它,但我希望它应该工作.

这里的缺点是你应该明确指定你的类型,它不再被扣除

foo<std::string>::f()foo<std::string>::f("Text")

我在这里的猜测是添加像包装函数:

template<typename T>voID f_wrapper(const T &v = T()){  foo<T>::f(v);}
总结

以上是内存溢出为你收集整理的c – 使用模板特化,默认参数和VS2013编译错误全部内容,希望文章能够帮你解决c – 使用模板特化,默认参数和VS2013编译错误所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存