鉴于以下代码,GCC处理得很好。但是,Visual C ++ 2010-2015给出了以下错误消息,指出它将reverse_iterator的迭代器成员视为它的基本类型,而不是它的派生类型:
"错误1错误C2039:'得到' :不是' std :: iterator< std :: random_access_iterator_tag,element_type,ptrdiff_t,element_type *,element_type&>'"
的成员显然,代码是一个用于说明情况的简化示例,与原始上下文无关,我们将不在此处讨论。唯一需要回答的问题是标题中的问题。
#include <iostream>
#include <iterator>
template <class element_type> class container
{
public:
class iterator : public std::iterator<std::random_access_iterator_tag, element_type, std::ptrdiff_t, element_type *, element_type &>
{
private:
element_type *a;
public:
element_type * get()
{
return a;
}
void set(element_type *value)
{
a = value;
}
};
class reverse_iterator : public std::reverse_iterator<iterator>
{
private:
iterator der1;
public:
iterator base()
{
return iterator(der1);
}
};
};
int main()
{
using namespace std;
container<int>::iterator c;
container<int>::reverse_iterator d;
cout << c.get() << " ";
cout << d.base().get() << endl;
return 0;
}
显然,如果你编译它,你会发现&#34; c.get()&#34;功能完美,d.base()。get()提供错误信息。
这是一个专门用于说明问题的构造示例。请不要提供与问题无关的答案。
请注意,当使用另一个人工构造的基类时,不会产生此错误 - 它特定于visual studio下的std :: iterator。
注意:感谢1201ProgramAlarm回答问题。解决方案是在reverse_iterator中阐明迭代器实例的命名空间,以便使用container :: iterator。要做到这一点,你只需使用&#34; typename container :: iterator&#34;而不是&#34;迭代器&#34;在reverse_iterator声明中。
答案 0 :(得分:3)
reverse_iterator
源自std::iterator
(<xutility>
中的iterator
),因此您在reverse_iterator
课程中对-(IBAction)startStopRecording:(UIButton *)sender
的引用将参考std版本,而不是你班级的版本。
答案 1 :(得分:0)
不要继承std::reverse_iterator
。
#include <iterator>
template <class element_type> class container
{
public:
class iterator : public std::iterator<std::random_access_iterator_tag, element_type, std::ptrdiff_t, element_type *, element_type &>
{
private:
element_type *a;
public:
element_type get()
{
return *a;
}
void set(element_type *value)
{
*a = value;
}
};
using reverse_iterator = std::reverse_iterator<iterator>;
iterator begin();
reverse_iterator rbegin() {
return std::make_reverse_iterator( end() );
}
};