2012-05-11 2 views
0

저는 템플릿 개념에 새로운 것이 있습니다. 내가 놓친 게 있니? 내가 함수 getNewNode의 주석과 getNewNode 함수에 대응하는 문을 칭찬 할 때 예상대로 제 ​​기능 getNewNode가 작동하지 않는 이유는클래스 본문 외부에있는 멤버 함수 정의가 오류가 발생합니다.

#ifndef STACK_H 
#define STACK_H 

template < class T> 
class Stack{ 
private: 
    struct node { 
    T data; 
    node* next; 
    }; 
    node * top; 
    //node* getNewNode(T num); 
}; 

//template <class T> 
//(node*)Stack<T> :: getNewNode(T num){ 
// node * temp = new node; 
//  temp->data = num; 
//  temp->next = NULL; 
//  return temp; 
// } 

#endif 

는, 컴파일러는 같은 오류를 제공합니다. 나는 어디로 잘못 갔는가?

Error 7 error C2470: 'Stack<T>::getNewNode' : looks like a function 
definition, but there is no parameter list; skipping apparent 
body c:\users\nitinjose\documents\visual studio 
2010\projects\templatequeue\templatequeue\stack.h 26 1 TemplateQueue 
Error 2 error C4430: missing type specifier - int assumed. Note: C++ 
does not support default-int c:\users\nitinjose\documents\visual 
studio 
2010\projects\templatequeue\templatequeue\stack.h 26 1 TemplateQueue 
Error 5 error C2146: syntax error : missing ')' before identifier 
'num' c:\users\nitinjose\documents\visual studio 
2010\projects\templatequeue\templatequeue\stack.h 26 1 TemplateQueue 
+0

템플릿 함수의 반환 유형은 일반적인 C++과 다르지 않습니다. (node ​​*) getnode (int num) 함수를 사용하면 컴파일러가 템플릿을 사용하는 것처럼 바클 럽니다. Troubadour는 절대적으로 정확합니다. 그의 대답. – johnathon

답변

1

반환 값의 지정이 잘못되었습니다. 이것을 시도하십시오

template <class T> 
typename Stack<T>::node* Stack<T> :: getNewNode(T num){ 
    // ... 
} 
+0

스마트 포인터를 사용하는 것이 더 좋습니다. – AJG85

1

클래스 본문 외부에서 멤버 함수를 정의하면 해당 시점에서 액세스 할 수있는 이름에 대한 규칙이 약간 변경됩니다. 귀하의 경우 컴파일러는 node 무엇인지 전혀 몰라. node*이 실제로는 Stack<T> 클래스에 있다고 말해야합니다. typename Stack<T>::node. node는 종속 이름이므로 typename이 필요합니다.