2013-09-07 2 views
3

저는 C++로 프로그래밍하는 템플릿에 익숙하지 않아서 템플릿 목록을 작성하기로 결정했습니다. 나는 라인 Node<T> *head;Node<T> *tail;ISO C++은 형식이없는 "무언가"선언을 금지합니다.

여기 내 헤더 파일 (오류 만이 나타납니다 때문에)입니다에이 오류를 얻을 :

#ifndef LIST_H 
#define LIST_H 

using namespace std; 

template <class T> class List { 

public: 
    List(); 
    T get(const int n); 
    void add(const T element); 
private: 
    Node<T> *head; 
    Node<T> *tail; 
    int size; 
}; 

template <class T> class Node { 
public : 
    Node(); 
    T get(); 
    void setNext(const Node<T> *next); 
    Node<T> getNext(); 
    void setValue(const T value); 
private: 
    T value; 
    Node *next; 
}; 

#endif // LIST_H 

아, 나는 Node<T> 전에 typename를 추가했지만, 그것은 나에게 expected nested-name-specifier before 'Node'했다.

답변

5

때문에 List 선언, 컴파일러 아무튼 동안 당신은 List 전에 Node 클래스 템플릿의 전방 선언을 할 필요가 Node

template <class T> class Node; // forward declaration for Node 

template <class T> class List {  
public: 
    List(); 
    T get(const int n); 
    void add(const T element); 
.... 
}; 


template <class T> class Node { 
public : 
.... 
}; 

.... 
+0

@SemyonDanilov 기꺼이 도와 줬습니다! – billz

2

그것은 당신이 List의 전에 Node 클래스 템플릿 정의를 넣어, 또는 앞으로 List 전에 Node을 선언해야 의미합니다. List 클래스 템플릿은 Node 클래스 템플릿의 존재를 알아야합니다.

제쳐두고, using namespace std, it is bad in general, and very bad in headers을 제거하십시오.

#ifndef LIST_H 
#define LIST_H 

template <class T> class Node { /* as before */ }; 

template <class T> class List { /* as before }; 

#endif // LIST_H 
1

선언 앞으로 List 또는의 앞에 당신의 Node 정의를 넣어 Node 클래스를 알면 :

template <class T> class Node; // Forward declaration 

template <class T> class List { 
    // ... 
}; 

template <class T> class Node{ 
    // ... 
}; 

심지어 당신은 List 전에 Node 클래스를 선언 할 수 있습니다 : 그런데

template <class T> class Node{ 
    // ... 
}; 

template <class T> class List { 
    // ... 
}; 

, using namespace std;header is considered a bad practice에.

관련 문제