0

下面的代码有什么问题?它正在一些编译器中编译;但在某些编译器中它会抛出一个错误,说:

conversion from scalar to non scalar

有人可以帮忙解决这个问题吗?


#include <iostream>
#include <set>

using namespace std;

class base
{
        typedef std::set<int> Sectors;

        class subclass
        {
                public:
                class subclass2
                {
                        private :
                        Sectors::const_iterator it;
                        public :
                        subclass2(Sectors::const_iterator& it);
                };
                subclass2 begin();

                private:
                Sectors _sectors;
        };
};

base::subclass::subclass2 base::subclass::begin()
{
         return this->_sectors.begin();
}

int main()
{
        return 0;
}
4

3 回答 3

3

问题是转换构造函数:

subclass2(Sectors::const_iterator& it);

通过采用可变的左值引用,它不能被临时调用;它们只能绑定到const右值引用。这里的这一行就是这样做的:

return this->_sectors.begin();

解决方法是通过const引用或值来获取参数。迭代器通常旨在成为适合按值传递的轻量级事物,所以我会这样做:

subclass2(Sectors::const_iterator it);
于 2013-05-23T12:28:02.710 回答
2

std::set::begin将迭代器返回到第一个元素(在您的情况下std::set<int>::iterator),而不是base::subclass::subclass2.

您应该将构造函数更改为以下内容:

subclass2(const Sectors::iterator& it);

允许获取临时对象。

于 2013-05-23T12:24:13.587 回答
0

你的代码很丑。可能你想做如下

#include <iostream>
#include <set>

using namespace std;

class base
{
    typedef std::set<int> Sectors;

    class subclass
    {
    public:
        class subclass2
        {
        private:
            Sectors::const_iterator it;
        public:
            subclass2(Sectors::const_iterator& it);
        };

        Sectors::const_iterator begin(){
            return _sectors.begin();
        }

    private:
        Sectors _sectors;
    };
};


int main()
{
    return 0;
}
于 2013-05-23T12:32:09.627 回答