gpt4 book ai didi

c++ - 函数返回基类而不是派生类,这是编码错误还是 Visual C++ 错误?

转载 作者:行者123 更新时间:2023-11-30 02:36:22 24 4
gpt4 key购买 nike

给定以下代码,GCC 可以很好地处理。然而,Visual C++ 2010-2015 给出了以下错误消息,表明它将 reverse_iterator 的迭代器成员视为基类型,而不是派生类型:

“错误 1 ​​error C2039: 'get' : 不是 'std::iterator ' 的成员”

显然,该代码是一个简化的示例,用于说明情况,与原始上下文无关,我们将不在此处解决。唯一要回答的问题是标题中的问题。

#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;
}

显然,如果您编译它,您会发现“c.get()”功能完美,d.base().get() 会提供错误消息。

这是一个专门为说明问题而构造的例子。请不要提供与问题无关的答案。

请注意,当使用另一个人为构造的基类时不会导致此错误 - 它特定于 visual studio 下的 std::iterator。

注意:感谢 1201ProgramAlarm 回答问题。解决方法是在reverse_iterator中明确迭代器实例的命名空间,这样使用的就是container::iterator。为此,您只需在 reverse_iterator 声明中使用“typename container::iterator”而不是“iterator”。

最佳答案

reverse_iterator源自 std::iterator (在 <xutility> 中)所以您对 iterator 的引用在你的reverse_iterator类将引用 std 版本,而不是你类中的版本。

关于c++ - 函数返回基类而不是派生类,这是编码错误还是 Visual C++ 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32900834/

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