gpt4 book ai didi

c++ - SFINAE : class member cannot be redeclared

转载 作者:行者123 更新时间:2023-11-27 23:57:18 27 4
gpt4 key购买 nike

我正在尝试创建自己的“智能迭代器”,并且我想使用 SFINAE 来根据迭代器的标签来设置一些运算符:

这是我的代码:

template<class Iterator, class Predicat, class Tag>
class RangeFilterIterator {
public:
RangeFilterIterator(Iterator begin, Iterator end, Predicat predicat) :
mBegin(begin), mEnd(end), mPredicat(predicat) {}

bool operator !=(RangeFilterIterator const &r) {
return mBegin != r.mBegin;
}

typename Iterator::value_type &operator*() {return *mBegin;}

RangeFilterIterator &operator++() {
while(mBegin != mEnd && mPredicat(*mBegin++));
return *this;
}

template<class = std::enable_if_t<std::is_base_of<std::random_access_iterator_tag, Tag>::value>>
RangeFilterIterator &operator+(std::size_t n) {
while(n--)
++(*this);
return *this;
}

template<class = std::enable_if_t<!std::is_base_of<std::random_access_iterator_tag, Tag>::value>>
RangeFilterIterator &operator+(std::size_t n) = delete;

private:
Iterator mBegin, mEnd;
Predicat mPredicat;
};

template<typename Container, typename Predicate>
auto RangeFilter(Container const &c, Predicate p) {
using Iterator = RangeFilterIterator<typename Container::iterator,
Predicate,
typename Container::iterator::iterator_category>;
Iterator begin(const_cast<Container&>(c).begin(), const_cast<Container&>(c).end(), p);
Iterator end(const_cast<Container&>(c).end(), const_cast<Container&>(c).end(), p);
return Range(begin, end);
}

RangeFilterIterator &operator+(std::size_t n) = delete 这行我得到了错误:无法重新声明类成员

我对模板不是“好”,但我认为使用 SFINAE 只有两者之一会被“声明”。我错过了什么吗?可以不这样吗?

最佳答案

好的,当我使用返回类型参数而不是模板参数时,它可以工作。

template<class tag = Tag>
std::enable_if_t<std::is_base_of<std::random_access_iterator_tag, tag>::value, RangeFilterIterator>
&operator+(std::size_t n) {
while(n--)
++(*this);
return *this;
}

template<class tag = Tag>
std::enable_if_t<!std::is_base_of<std::random_access_iterator_tag, tag>::value, RangeFilterIterator>
&operator+(std::size_t n) = delete;

关于c++ - SFINAE : class member cannot be redeclared,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41646253/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com