2010-11-18 2 views
2

내가이 뭔가 같은 스택 데이터 구조 쓴 FUNC 밀어 컴파일되지 않습니다스택 템플릿은

template<class T> 
Stos<T>::Stos(const T& n = 0): count(1) { 
    member = new Element(n); 
} 

template<class T> 
T Stos<T>::get() { 
    return member->n; 
} 

template<class T> 
Stos<T>::Element* Stos<T>::push(const T& n = 0) { 
    Element* point = member; 
    member = new Element; 
    member->prev = point; 
    if(n != 0) member->n = n; 
    ++count; 
    return member; 
} 

template<class T> 
T Stos<T>::pop() { 
    Element* point = member; 
    T n = point->n; 
    member = point->prev; 
    --count; 
    delete point; 
    return n; 
} 

template<class T> 
void Stos<T>::mod(const T& n) { 
    member->n = n; 
} 

template<class T> 
Stos<T>::~Stos() { 
    while(member) pop(); 
} 

을 그리고 나는 그것을 컴파일 할 때 g ++에서 정의의 첫 번째 줄인 Stos::Element* Stos::push() : expected constructor, destructor, or type conversion before ‘*’ token에 대해이 오류가 발생합니다. 그것은 템플릿으로 무언가를 쓰는 나의 첫번째 시도입니다. 이 스택 코드는 템플릿을 사용하지 않고도 편집 할 수 있었지만 오류가 발생했습니다. "T"대신 "int"를 사용하여 모든 것이 잘 수행되었습니다.

그리고 왜 컴파일되지 않는지 알 수 없습니다. class :: member에 대한 포인터를 사용할 수 없습니까?

답변

5
+0

고맙습니다. 작동합니다. – silmeth

+1

StackOverflow는 질문에 C++로 태그가 지정되고 "템플릿"과 "컴파일"이 해당 주제에서 발견되면 자동으로 "사용자가 typename이 필요합니다"를 넣어야합니다. –

+1

"VS에서 포팅 된"경우에도 어딘가에 질문에 포함되어 있습니다 :-) – mmmmmmmm

2

또한 사용하는 것이 좋습니다이 필요한 이유에 대한 자세한 설명에 대한 링크입니다 typename

typename Stos<T>::Element* Stos<T>::push(const T& n = 0) 

로 이름 Element을 접두사 필요

0 대신 모든 가능한 T는 할 수 있습니다 없습니다 때문에

const T &n = 0 

는 0에서 초기화 할 수 있습니다!

+0

음, 알 수없는 T가있는 인수없이 push()를 사용하면 안됩니다 .-)). – silmeth

관련 문제