2014-10-03 8 views
0

내부 친구 노드 클래스가있는 PriorityQueue 템플릿 클래스를 만듭니다.템플릿 클래스를 만드는 중 오류가 발생했습니다.

PriorityQueue.h:20:12: error: declaration of ‘class T’ 
    template<typename T> class Node 
      ^
PriorityQueue.h:16:11: error: shadows template parm ‘class T’ 
template <typename T> class PriorityQueue 
     ^
PriorityQueue.h:22:25: error: expected nested-name-specifier 
     friend typename PriorityQueue<T>; 
         ^
PriorityQueue.h:22:41: error: invalid declarator before ‘;’ token 
     friend typename PriorityQueue<T>; 
             ^
PriorityQueue.cpp:66:1: error: ‘PriorityQueue<T>::Node’ is not a type 
PriorityQueue<T>::Node::Node() 
^ 
PriorityQueue.cpp:66:30: error: ISO C++ forbids declaration of ‘Node’ with no type [-fpermissive] 
PriorityQueue<T>::Node::Node() 
          ^
PriorityQueue.cpp:66:30: error: invalid use of dependent type ‘typename PriorityQueue<T>::Node’ 

PriorityQueue.cpp:74:1: error: ‘PriorityQueue<T>::Node’ is not a type 
PriorityQueue<T>::Node::Node(T data, int *index, float priority) 
^ 

PriorityQueue.cpp : 74 : 64 : 오류 : ISO C++이없는 유형 '노드'의 선언을 금지 [-fpermissive] PriorityQueue 인 나는 아래의 코드를 컴파일 할 때, 지금은 이러한 오류를 수신하고 :: 노드 : 노드 (T 데이터 INT * 인덱스 플로트 우선 순위) ^ PriorityQueue.cpp : 74 : 64 : 오류 : 종속 형의 잘못된 사용 '유형 이름 :: PriorityQueue 인 노드의

PriorityQueue.h :

#ifndef PRIORITYQUEUE_H_ 
#define PRIORITYQUEUE_H_ 
#include <vector> 
#include <map> 

using namespace std; 

template<typename T> class Node 

template <typename T> class PriorityQueue 
{ 

public: 
    template<typename T> class Node 
    { 
      friend typename PriorityQueue<T>; 
     private: 
       T data; 
      int *index; 
      float priority; 

      public: 
      Node(); 
      Node(T data, int *index, float priority);  
    }; 

private: 
    vector<T> v; 
    map<T, int*> m; 
    int vSize; 
public: 
    PriorityQueue(); 
    ~PriorityQueue(); 
    void insert(T obj, float priority); 
    T front(); 
    T pop(); 
    bool isEmpty(); 
    void changePriority(T obj, float new_priority); 

}; 

#endif 

PriorityQueue.cpp :

#include "PriorityQueue.h" 
#include <vector> 
#include <map> 

using namespace std; 

template<class T> 
PriorityQueue<T>::PriorityQueue() 
{ 
    vector<T> v; 
    map<T, int*> m; 
    this.vSize = 0; 
} 
template<class T> 
PriorityQueue<T>::~PriorityQueue() 
{ 

} 
template<class T> 
void PriorityQueue<T>::insert(T obj, float priority) 
{ 
    Node<T> n = new Node<T>(obj, vSize, priority); 

    v[vSize] = n; 
    m.insert(obj, vSize); 

    vSize++; 
} 
template<class T> 
T PriorityQueue<T>::front() 
{ 

} 
template<class T> 
T PriorityQueue<T>::pop() 
{ 

} 
template<class T> 
bool PriorityQueue<T>::isEmpty() 
{ 
    bool b = false; 
    if(vSize > 0) 
    { 
     b = true; 
     return b; 
    } 
    else 
    { 
     return b; 
    } 
} 
template<class T> 
void PriorityQueue<T>::changePriority(T obj, float new_priority) 
{ 

} 

template<class T> 
PriorityQueue<T>::Node::Node() 
{ 
    data = NULL; 
    index = 0; 
    priority = 0.0; 
} 

template<class T> 
PriorityQueue<T>::Node::Node(T data, int *index, float priority) 
{ 
    this->data = data; 
    this->index = index; 
    this->priority = priority; 
} 

모든 도움을 주시면 감사하겠습니다.

+0

'Node' 자체는 템플릿 클래스 일 필요는 없습니다. 중첩 클래스이기 때문에'PriorityQueue' 템플릿의'T'에 접근 할 수 있습니다. 즉,'PriorityQueue :: Node' 타입은'PriorityQueue :: Node'와 다른 타입입니다. (또 다른 방법은'Node'는 템플릿 클래스'PriorityQueue'의 일부이고 이것은 암시 적으로 템플릿이됩니다.) – cdhowie

답변

2

앞으로 노드 선언 다음에 세미콜론이 누락 된 것처럼 보입니다. 아마도 컴파일러의 두통의 원인 일 겁니다.

+0

예. 또한 여기에 주어진 코드에서 알 수있는 한, 전방 선언 자체는 쓸모가 없습니다. 'PriorityQueue' 안에 중첩 된'Node' 템플릿을 앞으로 선언 할 의도가 있습니까? – jogojapan

+0

예, 그렇습니다. – user2932450

+0

그러나 이제는 새로운 오류가 발생했습니다. :( – user2932450

관련 문제