我正在尝试创建一个接受可迭代和函数的模板化函数,这样传递的函数将被隐式转换为std::function
适当类型的 a(从而允许它与完整函数和 lambdas 一起使用)。
这是代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <typeinfo>
template<typename T>
void bar(const T & base, std::function<bool(int)> f) // works
//void bar(const T & base, std::function<bool(typename T::iterator::value_type)> f) // fails to compile
{
std::cout << ((typeid(std::function<bool(int)>) == typeid(std::function<bool(typename T::iterator::value_type)>))?"identical":"distinct") << std::endl;
}
bool filter(int x) { return x%2==0; }
int main() { bar(std::vector<int> {0, 1}, filter); }
用这个编译g++-4.7 -std=c++11 -o itest itest.cpp
产生identical
.
如果您取消注释第 10 行和注释第 9 行并按上述方式编译,则编译失败并显示
g++-4.7 -std=c++11 -Wall -Werror -o itest itest.cpp
itest.cpp: In function 'int main()':
itest.cpp:16:53: error: no matching function for call to 'bar(std::vector<int>, bool (&)(int))'
itest.cpp:16:53: note: candidate is:
itest.cpp:9:10: note: template<class T> void bar(const T&, std::function<bool(typename T::iterator::value_type)>)
itest.cpp:9:10: note: template argument deduction/substitution failed:
itest.cpp:16:53: note: mismatched types 'std::function<bool(typename T::iterator::value_type)>' and 'bool (*)(int)'
我应该注意到未修改的版本在 Xcode 上成功(设置了适当的选项),但如果可能的话,我更愿意坚持使用 g++ 而不是 clang。我做错了什么,或者这是g ++中的一个已知错误?