我想使用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)
我看到的两个问题:
你正在写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)
| 归档时间: |
|
| 查看次数: |
445 次 |
| 最近记录: |