gpt4 book ai didi

c++ - 简单迭代器:std::count 错误

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:54 25 4
gpt4 key购买 nike

这是一个简单的练习。我想自己为 C 风格的字符数组编写一个自定义迭代器:没有提升。我想我已经完成了一半,但是在使用 std::count 时出现错误。

我的迭代器是这样的:

class myIterator : std::iterator<std::input_iterator_tag, char>
{
char *p;

public:

// Definitions
typedef typename std::iterator<std::input_iterator_tag, char>::difference_type difference_type;
typedef typename std::iterator<std::input_iterator_tag, char>::value_type value_type;
typedef typename std::iterator<std::input_iterator_tag, char>::reference reference;
typedef typename std::iterator<std::input_iterator_tag, char>::pointer pointer;

// Implementation
myIterator(char* x) :p(x) { };
myIterator(const myIterator& i) : p(i.p) { };
myIterator& operator++() { ++p; return *this; };
myIterator operator++(int) {myIterator tmp(*this); operator++(); return tmp; };
bool operator==(const myIterator& rhs) { return p == rhs.p; };
bool operator!=(const myIterator& rhs) { return p != rhs.p; };
char& operator*() { return *p; };
};

所以,当我在 for 循环中使用迭代器时,它很棒,它

for (auto it = data.begin(); it != data.end(); it++)
std::cout << *it;

但是,这会导致编译时错误:

std::cout << std::count(data.begin(), data.end(), '@') << std::endl;

就其值(value)而言,data 是一个 super 简单的类,具有用于 begin()end() 的经典包装函数( return myIterator(address_);return myIterator(address_ + size_);

什么错误让我很困惑:

error: no matching function for call to 'count'
[...]
note: candidate template ignored: substitution failure [with _InputIterator = myIterator, _Tp = char]: no type named 'difference_type' in 'std::__1::iterator_traits<myIterator>'
count(_InputIterator __first, _InputIterator __last, const _Tp& __value_)

我在这里遗漏了一些东西:我在迭代器中声明了 difference_type

有人能帮忙吗?

最佳答案

std::iterator 派生您的类已经定义了 value_typedifference_type 等。因此您不应该定义它们。只需公开您的继承并删除那些 typedef,它就会起作用:

class myIterator : public std::iterator<std::input_iterator_tag, char>
{
char *p;

public:
// Implementation
myIterator(char* x) :p(x) { };
// ......
};

请注意,没有必要删除 typedef,但没有理由手动定义它们,std::iterator 已经这样做了。

演示 here .

关于c++ - 简单迭代器:std::count 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19404681/

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