2014-10-03 5 views
0

Я создаю класс шаблона PriorityQueue, в котором находится внутренний класс класса Node. При попытке скомпилировать код ниже, я сейчас получить эти ошибки:Ошибки, связанные с созданием класса шаблона

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++ запрещает декларации 'Node' без указания типа [-fpermissive] PriorityQueue :: Node :: Node (T данные, INT * индекс, поплавок приоритет) ^ PriorityQueue.cpp: 74: 64: ошибка: неправильное использование зависимого типа 'TYPENAME PriorityQueue :: Node'

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' не должен быть классом шаблона; он имеет доступ к 'T' шаблона' PriorityQueue', потому что это вложенный класс. Другими словами, тип 'PriorityQueue :: Node' отличается от типа PriorityQueue :: Node'. (Еще один способ взглянуть на то, что 'Node' является частью класса шаблона' PriorityQueue', и это делает его также неявным шаблоном.) – cdhowie

ответ

2

Похоже, вам не хватает полуколонии после вашего прямого объявления узла. Вероятно, это источник головной боли компилятора.

+0

Да. Кроме того, насколько я могу судить по приведенному здесь коду, эта декларация сама по себе бесполезна. Есть ли намерение там переслать-объявить шаблон 'Node', который вложен внутри' PriorityQueue'? – jogojapan

+0

Да, действительно. – user2932450

+0

Однако теперь я столкнулся с некоторыми новыми ошибками. :( – user2932450

Смежные вопросы