c++ - 在函数参数中使用模板参数不起作用 gcc4.8

标签 c++ templates gcc c++11 lambda

我有这样的功能:

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/

相关文章:

c++ - SFINAE 和定义顺序

c++ - 无法使用 opencv 执行简单程序,错误 "Can' t 找不到程序的入口点”

c++ - 读取字符后跟数字c++

c++ - 将可变参数模板的参数分成不同的列表?

c - 为什么 scanf() 会导致此代码中的无限循环?

c++ - i2c 中的字节指针数组

c++ - boost 中的模板无效元函数

c++ - 如果有一个带有通用单个参数的模板构造函数,为什么我必须有一个复制构造函数?

gcc - 为什么我不能将汇编器输出通过管道传输到标准输出?

c - 复合语句( block )是否被 ANSI C 中的括号表达式包围?