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

时间:2015-10-02 05:03:03

标签: c++ visual-studio-2010 inheritance iterator visual-studio-2015

鉴于以下代码,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声明中。

2 个答案:

答案 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() );
    }
};