尝试构建时出现以下错误:
error: invalid initialization of non-const reference of type "std::vector<......"
代码:
class Config {
public:
std::vector<string>& GetValuesForList(std::string listName);
private:
std::map<std::string, std::vector<string> > lists;
};
inline std::vector<string>&
Config::GetValuesForList(std::string listName) {
return lists.find(listName);
}
我已经读过它,似乎是因为C ++的临时工,但我不确定如何解决它。任何帮助将不胜感激。
感谢。
答案 0 :(得分:2)
您想要return lists.find(listName)->second;
吗?
[旁注:lists
对map
vector
{{1}}的事物来说不是一个非常好的名称!]
答案 1 :(得分:2)
map::find返回迭代器。所以你应该使用它的第二个值:
inline std::vector<string>&
Config::GetValuesForList(std::string listName) {
return lists.find(listName)->second;
}
答案 2 :(得分:0)
map::find()
返回pair<key,value>
的迭代器。
我认为写这个更好:
std::vector<string>& Config::GetValuesForList(std::string listName)
{
return lists[listName];
}
如果地图中存在密钥listName
,则它将返回关联的值。否则,它将在地图中创建一个新条目,并将返回新创建的std::vector<T>
,这将是空的。
我还建议您在调用上述函数之前添加另一个可用于检查的函数bool DoesExist(std::string listName)
,以避免在找不到密钥时创建新条目:
bool DoesExist(std::string listName)
{
return lists.find(listName) != lists.end();
}
此外,如果您将名称lists
更改为vecMap
,情况会更好。
答案 3 :(得分:0)
std::map<T>::find()
返回std::map<T>::iterator
,而不是对值类型的引用。你想要的是下面的
inline std::vector<string>&
Config::GetValuesForList(std::string listName) {
std::map<std::string, std::vector<string> >::iterator itr = lists.find(listName);
if (itr != lists.end()) {
return itr->second;;
} else {
// What to do if not found.
}
}
作为一个注释,如果你想要它创建一个新的空向量,如果没有找到,那么你可以简化整个事情
inline std::vector<string>&
Config::GetValuesForList(std::string listName) {
return lists[listName]; // Creates a new vector if listname not found
}