为什么clang接受代码但被vc拒绝?
发布时间:2020-12-16 03:45:06 所属栏目:百科 来源:网络整理
导读:clang 3.4接受以下代码;而vc NOV 2013 CTP拒绝它有一个错误: error C2668: 'AreEqual' : ambiguous call to overloaded function templateclass headT,class... tailTypesconstexpr headT __GetFirst__(headT value,tailTypes...){ return static_castheadT
clang 3.4接受以下代码;而vc NOV 2013 CTP拒绝它有一个错误:
error C2668: 'AreEqual' : ambiguous call to overloaded function template<class headT,class... tailTypes> constexpr headT&& __GetFirst__(headT&& value,tailTypes&&...) { return static_cast<headT&&>(value); }; template<class T> constexpr bool AreEqual(const T& a,const T& b) { return a == b; } template<class headT,class... tailTypes> constexpr bool AreEqual(const headT& head_value,const tailTypes&... tail_values) { return AreEqual(head_value,__GetFirst__(tail_values...)) && AreEqual(tail_values...); } int main() { AreEqual(1,1,2,1); } 哪个编译器符合C 14标准? 更新:完整的错误消息: error C2668: 'AreEqual' : ambiguous call to overloaded function 1> d:projectsktltestmain.cpp(20): could be 'bool AreEqual<headT,int>(const headT &,const int &)' 1> with 1> [ 1> headT=int 1> ] 1> d:projectsktltestmain.cpp(8): or 'bool AreEqual<headT>(const T &,const T &)' 1> with 1> [ 1> headT=int 1>,T=int 1> ] 1> while trying to match the argument list '(const int,const int)' 1> 1>Build FAILED. 解决方法
Clang(和GCC)的行为是正确的.您可以阅读标准的§14.8.2.4[temp.deduct.partial],了解如何完成功能模板的部分排序,但该子条款第8页中给出的示例直接涵盖了这种情况:
template<class... Args> void f(Args... args); // #1 template<class T1,class... Args> void f(T1 a1,Args... args); // #2 template<class T1,class T2> void f(T1 a1,T2 a2); // #3 f(); // calls #1 f(1,3); // calls #2 f(1,2); // calls #3; non-variadic template #3 is more // specialized than the variadic templates #1 and #2 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |