2012-04-25 7 views
1
을 사용

내가 템플릿 클래스를 컴파일 할 때, 나는 다음과 같은 오류가있어 : 채널 파일에서C++ 템플릿, 오류가 어디 표준 반복자

C.cpp: In member function 'void PeriodContainerAdvanced<T>::add()': 
C.cpp:133: error: type/value mismatch at argument 1 in template parameter list for 'template<class _T1, class _T2> struct std::pair' 
C.cpp:133: error: expected a type, got 'std::map<int,T,std::less<int>,std::allocator<std::pair<const int, T> > >::iterator' 
C.cpp:133: error: invalid type in declaration before ';' token 

클래스 : (간체)

template <class T> 
class PeriodContainerAdvanced 
{ 
[skip] 
    void add(); 
[skip] 
} 

C.cpp (간체) :

template <class T> 
void PeriodContainerAdvanced<T>::add() 
{ 
[skip] 
    std::pair<std::map< time_t, T >::iterator, bool> ret; // line 133 ! 
[skip] 
} 

그리고 다른 기능에서 유사한 오류가

을 정의 할 때 이 라인 컴파일러 후
std::map< time_t, T >::iterator it, it_start, it_end; // line 153 

말 :

C.cpp:153: error: expected `;' before 'it' 
C.cpp:166: error: 'it_start' was not declared in this scope 

어떻게 그것을 해결하기 위해? 종속 이름의 감사

답변

9

, 당신은로 선언해야합니다 : 또한

std::pair<typename std::map< time_t, T >::iterator, bool> ret; 

, 나중에 링커 오류를 방지하기 위해, 당신이 사용하는 모든 번역 단위에 볼 수있는 파일에 템플릿 구현을 이동해야합니다 template - 템플릿 클래스를 정의하는 헤더와 같습니다.

+0

감사합니다. 그 이름은 – abrahab

6

먼저, add() 구현을 헤더 파일 또는 헤더에 포함 된 파일에 넣어야합니다. 컴파일러는 주어진 T에 대한 템플릿을 인스턴스화하기 위해 코드를보아야합니다.

두 번째로 인용 부호 오류의 출처는 컴파일러에 유형에 대해 말하기 위해 typename을 추가해야합니다. std::map< time_t, T >::iterator은 값으로 해석 될 수 있습니다.

template <class T> 
class PeriodContainerAdvanced { 
    void add() { 
    std::pair<typename std::map< time_t, T >::iterator, bool> ret; 
    ....  ^
    } 
}; 
+0

입니다. 컴파일은 "첫 번째"단계가없고 두 번째 단계 만 수행합니다. 감사. void add()와 같은 헤더 파일에 정의 된 추가; (첫 번째 메시지 참조). C.cpp – abrahab

+0

@abrahab OK에서 구현되었습니다. 빌드 시스템이 뭔가 마술을하지 않는 한 완전히 이상합니다. 또는 실행 파일에서 아직 사용하지 않으려 고했을 수도 있습니다. – juanchopanza

+0

가 이미 사용되었습니다. gcc는 클래스 함수의 구현이 다음과 같이 더럽혀 졌음을 알고 있습니다. 템플릿 void PeriodContainerAdvanced :: add() {..} C.cpp. 흥미 롭 군. 그것의 다른 모든 사람들이 분리 된 .cpp 파일에서 작동하는 것처럼 ... – abrahab