首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从地图读取时出现"Invalid initialization“错误

从地图读取时出现"Invalid initialization“错误
EN

Stack Overflow用户
提问于 2011-08-12 19:16:34
回答 4查看 354关注 0票数 0

我在尝试构建时遇到以下错误:

代码语言:javascript
复制
error: invalid initialization of non-const reference of type "std::vector<......"

代码:

代码语言:javascript
复制
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++临时的原因,但我不确定如何解决它。任何帮助都将不胜感激。

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-12 19:21:53

map::find返回迭代器。所以你应该使用它的第二个值:

代码语言:javascript
复制
    inline std::vector<string>&
    Config::GetValuesForList(std::string listName) {
        return lists.find(listName)->second;
    }
票数 2
EN

Stack Overflow用户

发布于 2011-08-12 19:20:45

你想要return lists.find(listName)->second;

旁注:对于vectormap来说,lists不是一个很好的名字!

票数 2
EN

Stack Overflow用户

发布于 2011-08-12 19:21:40

map::find()pair<key,value>返回一个迭代器。

我认为这样写更好:

代码语言:javascript
复制
std::vector<string>& Config::GetValuesForList(std::string listName) 
{
    return lists[listName];
}

如果键listName存在于映射中,那么它将返回相关的值。否则,它将在映射中创建一个新条目,并返回新创建的std::vector<T>,该值将为空。

我还建议你在调用上面的函数之前,添加另一个函数作为bool DoesExist(std::string listName),你可以用它来检查,以避免在找不到密钥的情况下创建新的条目:

代码语言:javascript
复制
bool DoesExist(std::string listName)
{
   return lists.find(listName) != lists.end();
}

此外,如果将名称lists更改为vecMap会更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7039304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档