我有这样的功能:
template<typename Iterator>
void sort2(Iterator it,
std::function<bool(typename std::remove_pointer<
typename Iterator::iterator_type>::type,
int)> func)
{
}
int main()
{
std::vector<int> a;
sort2(a.begin(),[](int,int){return false;});
}
'main()::__lambda0' is not derived from 'std::function<bool(typename std::remove_pointer<typename Iterator::iterator_type>::type, int)>'
sort2(a.begin(),[](int,int){return false;});
^
当我把它改成:
template<typename Iterator>
void sort2(Iterator it,
std::function<bool(typename std::remove_pointer<
typename vector<int>::iterator/*I change this*/::iterator_type>::type,
int)> func)
{
}
它编译得很好......
第一个函数有什么问题?!
看起来是正确的...为什么会出现编译错误?
最佳答案
迭代器没有名为 iterator_type
的成员.你要Iterator::value_type
( Live at Coliru ):
template<typename Iterator>
void sort2(Iterator it,
std::function<bool(typename std::remove_pointer<
typename Iterator::value_type>::type,
int)> func)
{
}
或者更好的是,使用 std::iterator_traits<Iterator>::value_type
所以你的函数将接受指针以及类类型迭代器(Coliru again):
template<typename Iterator>
void sort2(Iterator it,
std::function<bool(typename std::remove_pointer<
typename std::iterator_traits<Iterator>::value_type>::type,
int)> func)
{
}
更通用的版本会接受比较器类型作为模板参数,并使用 SFINAE 将该类型限制为可使用两个 value_type
调用的函数。 s 具有可转换为 bool 的返回类型,而不是使用可转换为 std::function<bool(value_type, value_type)
:
template <typename Iterator>
using ValueType = typename std::iterator_traits<Iterator>::value_type;
template<typename Iterator, typename Function>
auto sort2(Iterator first, Iterator last, Function func) ->
typename std::enable_if<
std::is_convertible<decltype(func(std::declval<ValueType<Iterator>>(),
std::declval<ValueType<Iterator>>())),
bool>::value
>::type
{
std::sort(first, last, func);
}
它非常丑陋 - SFINAE 的约束总是 - but at least gcc compiles it successfully .
关于c++ - 在函数参数中使用模板参数不起作用 gcc4.8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23891101/