启用_if问题

Spe*_*001 2 c++ templates

我想使用SFINAE原理来检查实例化的模板是否是随机访问迭代器。为此,我使用了std::enable_if,但编译器会抛出错误:

无法与先前的“类型名称”声明说明符组合

我该如何修复它?我真的需要帮助才能弄清楚。

template<class RandomAccessIterator, class Compare>
typename std::enable_if<std::is_same<std::random_access_iterator_tag, RandomAccessIterator>::value>
void quick_sort(RandomAccessIterator first, RandomAccessIterator last, Compare compare) {
    sorting(first, last, 0, last - first - 1, compare);
}
Run Code Online (Sandbox Code Playgroud)

med*_*le1 5

我看到的两个问题:

  • 你正在写std::enable_if<>而不是std::enable_if<>::type,这可能不是你想要做的。

  • (错误原因)你有两种返回类型:std::enable_if<>和void。您只能有一种返回类型。

std::enable_if有第二个可选类型参数,即 的类型std::enable_if<>::type。默认设置为,void因此您的返回类型已经是voidfrom std::enable_if<>::type。但是,由于您要输入enable_if返回类型,我建议您明确指定返回类型为void.

所以你的问题的解决方案看起来像这样:

template <class RandomAccessIterator, class Compare>
typename std::enable_if<
    std::is_same<std::random_access_iterator_tag, RandomAccessIterator>::value,
    void
>::type quick_sort(RandomAccessIterator first, RandomAccessIterator last, Compare compare) {
    sorting(first, last, 0, last - first - 1, compare);
}
Run Code Online (Sandbox Code Playgroud)

std::enable_if或者,您可以在模板参数中使用:

template <
    class RandomAccessIterator,
    class Compare,
    typename std::enable_if<
        std::is_same<std::random_access_iterator_tag, RandomAccessIterator>::value,
        std::nullptr_t
    >::type = nullptr
>
void quick_sort(RandomAccessIterator first, RandomAccessIterator last, Compare compare) {
    sorting(first, last, 0, last - first - 1, compare);
}
Run Code Online (Sandbox Code Playgroud)