从地图读取时出现“无效初始化”错误

时间:2011-08-12 11:16:34

标签: c++

尝试构建时出现以下错误:

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 ++的临时工,但我不确定如何解决它。任何帮助将不胜感激。

感谢。

4 个答案:

答案 0 :(得分:2)

您想要return lists.find(listName)->second;吗?

[旁注:listsmap 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
    }