【问题标题】:Errors associated with a creating a template class与创建模板类相关的错误
【发布时间】:2014-10-03 03:31:43
【问题描述】:

我正在创建一个包含内部朋友 Node 类的 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::Node::Node(T data, int *index, float priority) ^ 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;
}

任何帮助将不胜感激。

【问题讨论】:

  • 请注意Node 本身不必是模板类;它可以访问PriorityQueue 模板的T,因为它是一个嵌套类。换句话说,PriorityQueue&lt;int&gt;::Node 类型与PriorityQueue&lt;float&gt;::Node 类型不同。 (另一种看待方式是 Node 是模板类 PriorityQueue 的一部分,这使得它也隐式成为模板。)

标签: c++ compiler-errors queue priority-queue


【解决方案1】:

看起来您在前向声明 Node.js 后缺少一个分号。这可能是编译器头痛的根源。

【讨论】:

  • 是的。此外,据我从这里给出的代码可以看出,前向声明本身是无用的。是否打算前向声明嵌套在PriorityQueue 内的Node 模板?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多