2013-07-23 4 views
1

오류는 AssocArray 외부에있는 type& AssocArray<key, value>::operator[](key& k)에서 발생합니다. I 오류 메시지가 얻을 내가 왜 혼란 스러워요 :typedef에서 C++ 템플릿 오류

error C2143: syntax error : missing ';' before '&' 
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

편집 : 나는이 다음 문을 시도

:

typedef typename std::pair<key, value> type; 

typedef std::pair<key, value> type; 

using type = std::pair<key, value>; 

그들 중 하나가 작동하지 않았다입니다.

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

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

    bool isItem(key& k); 

    type& operator[] (key& k); 
protected: 
private: 
    std::vector<type> vecData; 
}; 

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

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

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

    return vecData.end() != iter; 
} 

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; 
} 
+1

일부 중복 'typename'이 있습니다. – Rapptz

+0

제 편집을 참조하십시오. –

+0

'typedef'가 왜 작동하지 않을지 잘 모르겠습니다. 'type = std :: pair ; '을 사용 했습니까? – Rapptz

답변

1

n.m.m. 당신이 뭔가를 필요로 지적 :

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

또는 C++ 11 : 당신이 내 때까지 type 이후

template <typename key, typename value> 
auto AssocArray<key, value>::operator[](key& k) -> type & 
{ 
    ... 

이 클래스의 멤버는 이름이 알려져 있지 않습니다 클래스의 컨텍스트를 지정하거나 클래스 멤버를 정의하는 것으로 지정 될 때까지 대기합니다.

+0

후행 반환 유형을 잊어 버렸습니다. C++ 1y 옵션도 있습니다. 이것은'auto &'를 반환하는 것입니다. – chris

+0

... 또는'decltype (자동)', 사람들을 혼란스럽게한다면. – Casey

+0

그냥 @Vaughn Cato의 대답을 확장하기 :'typedef typename ... '에서 완전한 네임 스페이스를 사용하지 않을 때도 유사한 오류가 발생합니다. 분명히 GCC는 이것을 가능하게하지만 VC++는 그렇지 않습니다. – ShitalShah