当我尝试打印Map
的值Set
时,我遇到了问题。
我必须实现Map
和Set
的所有功能(不使用map
或设置库),但我确信它们的工作方式与它们相同。 printSet函数正在运行。
简要列举我的职能:
#define SType string
#define VType set
struct setNode {
SType key;
setNode* left;
setNode* right;
setNode* parent;
};
class set {
public:
set();
bool empty();
int size();
setNode* begin();
setNode* end();
setNode* next(setNode* x);
setNode* prev(setNode* x);
SType key(setNode* x);
setNode* find(SType k);
void insert(SType k);
void erase(SType k);
void clear();
void operator=(set& s);
~set();
private:
int size_;
setNode* root_;
};
struct mapNode {
SType key;
VType value;
mapNode* left;
mapNode* right;
mapNode* parent;
};
class map {
public:
map();
bool empty();
int size();
mapNode* begin();
mapNode* end();
mapNode* next(mapNode* x);
mapNode* prev(mapNode* x);
VType& operator[](SType k);
SType key(mapNode* x);
VType value(mapNode* x);
mapNode* find(SType k);
void insert(SType k, VType v);
void erase(SType k);
void clear();
void operator=(map& s);
~map();
private:
int size_;
mapNode* root_;
};
现在打印功能:
void printSet(set& c) {
for (setNode* i = c.begin(); i != c.end(); i = c.next(i)) {
cout << c.key(i) << " ";
}
}
void printMap(map& m){
for (mapNode* i = m.begin(); i != m.end(); i = m.next(i)) {
cout<<m.key(i)<<"\t";
printSet(m.value(i));//error in this line
cout<<endl;
}
}
我收到invalid initialization of non-const reference of type 'set&' from an rvalue of type 'set'
错误,但我无法弄清楚出了什么问题......
答案 0 :(得分:0)
问题是value(mapNode* x)
返回VType
这是一个临时值。
另一方面,void printSet(set& c)
通过参考得到一个变量。
这意味着您正在尝试存储和访问非法的临时值。
将您的打印功能更改为:
void printSet(const set& c)
void printMap(const map& m)
而且你也不能在它的const变量中使用map类的const成员,所以你必须使begin end key成为下一个值const
:
class map {
public:
map();
bool empty()const ;
int size()const ;
mapNode* begin()const;
mapNode* end()const;
mapNode* next(mapNode* x)const;
mapNode* prev(mapNode* x)const;
...
}