C++ 对象列在头文件中,但在cpp文件中未定义引用

C++ 对象列在头文件中,但在cpp文件中未定义引用,c++,heap,priority-queue,undefined-reference,C++,Heap,Priority Queue,Undefined Reference,在类中,在我的头文件中,在我拥有的类的私有部分中 Heap_PriorityQueue<Passenger> oldBoardingQueue; 接着是几个 undefined reference to 'non-virtual thunk to Heap_PriorityQueue<Passenger>::(Heap_PriorityQueue functions again) 适航性。h如下所示: Airworthy.o: Airworthy.cpp Airwo

在类中,在我的头文件中,在我拥有的类的私有部分中

 Heap_PriorityQueue<Passenger> oldBoardingQueue;
接着是几个

undefined reference to 'non-virtual thunk to Heap_PriorityQueue<Passenger>::(Heap_PriorityQueue functions again)
适航性。h如下所示:

Airworthy.o: Airworthy.cpp Airworthy.h  Heap_PriorityQueue.h NotFoundException.h PrecondViolatedExcep.h Passenger.h
g++ -std=gnu++11 -ggdb -c Airworthy.cpp
#ifndef AIRWORTHY_H
#define AIRWORTHY_H

#include "Heap_PriorityQueue.h"
#include "Passenger.h"

using namespace std;

class Airworthy
{
private:

    int oldBoardingSeconds;
    int randomBoardingSeconds;
    Heap_PriorityQueue<Passenger> oldBoardingQueue;
    Heap_PriorityQueue<Passenger> randomBoardingQueue;
    Passenger thisPassenger;

public:

    Airworthy();
    void inputFileData(ifstream& inputFile);
    void loadQueue(ifstream& inputFile, ofstream& outputFile);
    void runSim();
    void setOldBoardingPriority();
    void setRandomBoardingPriority();
};

#endif
\ifndef适航
#定义适航性
#包括“Heap_PriorityQueue.h”
#包括“乘客.h”
使用名称空间std;
舱位适航
{
私人:
int oldboadingseconds;
int随机板秒;
堆优先队列oldboadingqueue;
堆优先队列随机登车队列;
旅客;
公众:
适航();
无效输入文件数据(ifstream和inputFile);
void loadQueue(ifstream&inputFile、ofstream&outputFile);
void runSim();
void setOldboadingPriority();
void setRandomBoardingPriority();
};
#恩迪夫
我刚刚意识到错误是在第一次使用我刚刚空着的适合飞行的构造器时出现的。这是Airworthy.cpp的第一部分

#include "Airworthy.h"
#include "Heap_PriorityQueue.h"
#include "Passenger.h"
#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <cstdlib>

using namespace std;


Airworthy::Airworthy()
{
}
#包括“适航.h”
#包括“Heap_PriorityQueue.h”
#包括“乘客.h”
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
适航
{
}
尝试在构造函数中放置不同的东西(包括Heap\u PriorityQueues),但似乎没有什么不同。在主cpp文件中调用构造函数也会使该文件生成相同的错误

Heap_PriorityQueue.h如下所示:

#ifndef _HEAP_PRIORITY_QUEUE
#define _HEAP_PRIORITY_QUEUE

#include "ArrayMaxHeap.h"
#include "PriorityQueueInterface.h"

template<class ItemType>
class Heap_PriorityQueue : public PriorityQueueInterface<ItemType>,
private ArrayMaxHeap<ItemType>
{
public:
   Heap_PriorityQueue();
   bool isEmpty() const;
   bool add(const ItemType& newEntry);
   bool remove();

   /** @pre The priority queue is not empty. */
   ItemType peek() const throw(PrecondViolatedExcep);
}; // end Heap_PriorityQueue


#endif
\ifndef\u堆\u优先级\u队列
#定义\u堆\u优先级\u队列
#包括“ArrayMaxHeap.h”
#包括“PriorityQueueInterface.h”
模板
类Heap\u PriorityQueue:public PriorityQueueInterface,
专用阵列EXHEAP
{
公众:
堆优先级队列();
bool isEmpty()常量;
bool add(const ItemType和newEntry);
bool-remove();
/**@pre优先级队列不为空*/
ItemType peek()常量抛出(predviolatexcep);
}; // 结束堆优先级队列
#恩迪夫

我已经不知所措了,我已经努力让这该死的东西工作了好几个小时了。

我想可能的问题是你忘了在
Airworthy.o
的makefile配方中包含
Heap\u PriorityQueue.cpp
。因此,编译器正在查找队列函数的定义,而不是函数本身(这就是链接阶段中“未定义引用”的含义)


编辑:检查生成过程是否生成一个
Heap\u PriorityQueue.o
文件,以及该文件是否包含在创建exe的最终命令行中。

您能否显示一个(最好是小的)代码示例来重现所讨论的行为?另外,因为这听起来像是一个链接问题,请给我们您的链接器命令。或者您的模板类方法是在.cpp(a)中定义的?您是否包括类Passenger API所在的头文件?既然您提到在头文件和cpp文件中都包含
Heap\u PriorityQueue.h
,您是否使用?我记得当我不知道我需要使用护卫时,我遇到了一个循环包含不包含护卫的问题,而你的问题似乎和我的类似。好主意,所以我尝试了一下。没用,但谢谢你anyways@MKWhit好的,我扩展了我的答案
#ifndef _HEAP_PRIORITY_QUEUE
#define _HEAP_PRIORITY_QUEUE

#include "ArrayMaxHeap.h"
#include "PriorityQueueInterface.h"

template<class ItemType>
class Heap_PriorityQueue : public PriorityQueueInterface<ItemType>,
private ArrayMaxHeap<ItemType>
{
public:
   Heap_PriorityQueue();
   bool isEmpty() const;
   bool add(const ItemType& newEntry);
   bool remove();

   /** @pre The priority queue is not empty. */
   ItemType peek() const throw(PrecondViolatedExcep);
}; // end Heap_PriorityQueue


#endif