为什么gcc不能为我的函数模板推断出正确的类型?

时间:2014-04-12 15:02:10

标签: c++ templates template-deduction

#include <iostream>
#include <functional>
template<typename T>
struct id { typedef T type; };

template<typename T>
void f(T b, typename id<T>::type* a){}

int main() {
   f(0, 0);
}

vs2013:好的!

g++4.8.2:compile error,such is the info:

main.cpp: In function 'int main()':
main.cpp:10:10: error: no matching function for call to 'f(int, int)'
     f(0,0);
          ^
main.cpp:10:10: note: candidate is:
main.cpp:7:6: note: template<class T> void f(T, typename id<T>::type*)
 void f(T b, typename id<T>::type* a){}
      ^
main.cpp:7:6: note:   template argument deduction/substitution failed:
main.cpp:10:10: note:   mismatched types 'typename id<T>::type*' and 'int'
     f(0,0);
          ^

1 个答案:

答案 0 :(得分:2)

原因是标准一直不清楚具有部分复合类型(例如指针星)的非推导上下文会发生什么,从而使参数不匹配但仍然可以通过隐式转换接受参数

问题http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1184通过添加一个说明类似于函数参数不包含推导出的模板参数的情况来解决这个问题,应该允许隐式转换以弥补不匹配。

从那时起,已经发现了关于这些&#34;隐含转换的处理的其他问题&#34;在模板参数的参数推导期间,由http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1391处理。

总的来说,我认为1184的影响是GCC应该接受你的代码,但是由于#1391中反映的其他情况下的问题,他们可能已经推迟了#1184的实现,直到确切的细节得到解决。 / p>