在c ++中从标量转换为非标量

时间:2013-05-23 12:21:13

标签: c++

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

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

3 个答案:

答案 0 :(得分:3)

问题是转换构造函数:

subclass2(Sectors::const_iterator& it);

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

return this->_sectors.begin();

修复方法是通过const引用或值来获取参数。迭代器通常是轻量级的,适合传递值,所以我会这样做:

subclass2(Sectors::const_iterator it);

答案 1 :(得分:2)

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

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

subclass2(const Sectors::iterator& it);

允许携带临时物品。

答案 2 :(得分: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;
}