下面的代码有什么问题?它正在一些编译器中编译;但是在一些编译器中它会抛出一个错误,说:
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;
}
答案 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;
}