2011-08-12 2 views
0

내가 만들려고 다음과 같은 오류지고있어지도에서 읽을 때 :"잘못된 초기화"오류

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++ 임시 테이블 때문이지만,이를 해결하는 방법은 확실하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다.

감사합니다.

답변

2

map::find은 반복자를 반환합니다. 그래서 당신은 그것의 두 번째 값을 사용해야합니다

inline std::vector<string>& 
    Config::GetValuesForList(std::string listName) { 
     return lists.find(listName)->second; 
    } 
+0

정말 고마워. 완벽하게 작동했다. – MeanwhileInHell

2

return lists.find(listName)->second; 하시겠습니까?

[사이드 참고 : listsvectormap하는 것를위한 아주 좋은 이름이 아닙니다!]

+0

고마워으로 모든 일을 단순화 할 수없는 경우 새로운 빈 벡터를 만들려면 당신이 원하는 것은 것으로, 참고로 아래의

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. } } 

입니다 완벽하게 일했습니다. – MeanwhileInHell

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(); 
} 

또한 listsvecMap으로 변경하면 더 좋을 것입니다.

+0

그러나 키를 찾을 수 없으면 요소를 만듭니다. –

+0

@Oli : 예. 내 대답에이 정보를 추가하고 있었다. – Nawaz

0

std::map<T>::find()는 값 형식으로 참조하지하는 std::map<T>::iterator을 반환합니다. 당신은 당신이

inline std::vector<string>& 
    Config::GetValuesForList(std::string listName) { 
     return lists[listName]; // Creates a new vector if listname not found 
    }