2013-07-23 2 views
1

이렇게 코드를 작성하려고하면이 컴파일 오류가 발생합니다. 실제로 연산자 []에 과부하가 걸렸습니다. 혼란 스럽습니다. 아무도 도와 줄 수 없습니까? 여기 왜 오류가 발생합니까? 오버로드 된 연산자 []

AssocArray<int, int> ary; 
ary.addItem(1, 1); 
ary.addItem(2, 1); 
ary.addItem(3, 1); 
ary.addItem(4, 1); 
ary.addItem(5, 1); 
ary[5] = 2;//error occur here 

오류 메시지이다

error C2679: binary '[' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion) 
...could be 'int &opt::AssocArray<key,value>::operator [](key &)' 
with 
[ 
    key=int, 
    value=int 
] 
while trying to match the argument list '(opt::AssocArray<key,value>, int)' 
with 
[ 
    key=int, 
    value=int 
] 

다음 AssocArray의 구현이다 (참고 : * .H 파일에 위치)

template <typename key, typename value> 
    class AssocArray 
    { 
    public: 
     typedef typename std::pair<key, value> type; 

     bool addItem(key& k, value& v); 

     bool addItem(key k, value v); 

     bool isItem(key& k); 

     value& operator[] (key& k); 

     typename std::vector<type>::iterator begin() 
     { 
      return vecData.begin(); 
     } 

     typename std::vector<type>::iterator end() 
     { 
      return vecData.end(); 
     } 

    protected: 
    private: 
     std::vector<type> vecData; 
    }; 

    template <typename key, typename value> 
    bool AssocArray<key, value>::addItem(key k, value v) 
    { 
     if(isItem(k)) return false; 

     vecData.push_back(std::make_pair(k, v)); 
     return true; 
    } 

    template <typename key, typename value> 
    value& AssocArray<key, value>::operator[](key& k) 
    { 
     auto iter = std::find_if(vecData.begin(), vecData.end(), 
      [&](type& param) 
     { 
      return param.first == k; 
     } 
     ); 
     if(vecData.end() != iter) 
      return iter->second; 

     value v; 
     vecData.push_back(std::make_pair(k, v)); 
     return vecData.rbegin()->second; 
    } 

    template <typename key, typename value> 
    bool AssocArray<key, value>::isItem(key& k) 
    { 
     auto iter = std::find_if(vecData.begin(), vecData.end(), 
      [&](type& param) mutable -> bool 
     { 
      return param.first == k; 
     } 
     ); 

     return vecData.end() != iter; 
    } 
+2

당신의'operator []'는 참조를 받겠다고 선언되었지만'int'라는 리터럴을 전달합니다. – jogojapan

+0

@juanchopanza, 링커 오류가 발생합니다. – iammilind

답변

2

내 연산자 []는 비 좌항 기준을 취하기로 선언 :

template <typename key, typename value> 
value& AssocArray<key, value>::operator[](key& k) 

하지만 전달한 인수는 5이며 리터럴이므로 rvalue입니다.

template <typename key, typename value> 
value& AssocArray<key, value>::operator[](const key& k) 

이이를 rvalue에 결합 할 수 있으며, 모든 의지 : 연산자의 구현이 키를 수정하지 않는 것 때문에

, 나는 그것이 const를 좌변 참조 소요 있도록 선언을 변경하는 것이 좋습니다 좋아.

+0

해냈습니다, 정말로 고마워요. 나는이 실수를해서는 안된다. –