2011-11-09 2 views
13

표준 컨테이너의 value_type은 어떻게 사용합니까? 나는이 VALUE_TYPE가 무엇인지 ::라고 생각템플릿 매개 변수의 value_type 사용

prog.cpp:10: error: ‘T::value_type’ is not a type 
prog.cpp:14: error: type ‘T’ is not derived from type ‘TSContainer<T>’ 
prog.cpp:14: error: expected ‘;’ before ‘pop’ 
prog.cpp:19: error: expected `;' before ‘}’ token 
prog.cpp: In function ‘int main()’: 
prog.cpp:25: error: ‘class TSContainer<std::vector<int, std::allocator<int> > >’ has no member named ‘pop’ 
prog.cpp:25: warning: unused variable ‘v’ 

:
나는 그렇게처럼 사용하려고 :

#include <vector> 

using namespace std; 

template <typename T> 
class TSContainer { 
private: 
     T container; 
public: 
     void push(T::value_type& item) 
     { 
       container.push_back(item); 
     } 
     T::value_type pop() 
     { 
       T::value_type item = container.pop_front(); 
       return item; 
     } 
}; 
int main() 
{ 
     int i = 1; 
     TSContainer<vector<int> > tsc; 
     tsc.push(i); 
     int v = tsc.pop(); 
} 

하지만이 결과?

+0

가능한 복제본 어디에서 왜 "템플릿"및 "typename"키워드를 넣어야합니까?] (http://stackoverflow.com/questions/610245/where-and-why-do-i-have -to-put-the-template-and-typename-keywords) –

+1

재사용 가능한 라이브러리 코드를 작성할 때 (또는 심지어 언제든지)'using namespace std; '를 사용하지 않는 것이 좋습니다. 올바른 네임 스페이스를 입력하십시오. –

+0

@KerrekSB : 예였습니다. –

답변

21

당신은 typename을 사용해야합니다 : 등등

typename T::value_type pop() 

하고 있습니다.

이유는 컴파일러가 T :: value_type이 멤버 변수 유형인지 여부를 알 수 없기 때문입니다. 아무도 형식을 정의하지 않아도 템플릿에 전달할 수 있습니다. 그러나이 함수가 없으면 코드를 구문 분석 할 수 없습니다 (식별자가 유형 또는 변수를 지정하는지 여부에 따라 구문의 의미가 달라지기 때문에 예 : T * p은 곱하기 또는 포인터 선언 일 수 있음). 따라서 규칙은 유형 또는 변수 일 수 있고 그 앞에 접두어를 붙임으로써 형식으로 명시 적으로 표시되지 않은 모든 것을 변수로 간주한다는 규칙이 있습니다.

+0

설명 주셔서 감사합니다! –

+0

@Jonathan : 자세한 설명은이 FAQ도 참조하십시오. [템플릿의 typename 키워드는 무엇입니까?] (http://www.comeaucomputing.com/techtalk/templates/#typename) – ildjarn

7

typename 키워드를 사용하여 실제로 유형임을 나타냅니다.

void push(typename T::value_type& item) 

typename T::value_type pop() 
관련 문제