头文件中列出的对象,但cpp文件中未定义的引用

时间:2015-05-06 17:58:38

标签: c++ heap priority-queue undefined-reference

在课程中,在我的头文件中,在我的课程的私有部分

 Heap_PriorityQueue<Passenger> oldBoardingQueue;

我在标题和cpp中都有#include "Heap_PriorityQueue.h"只是为了安全。 我还没有开始在我的cpp文件中使用它,但是当我尝试编译cpp文件时抛出一堆:

undefiend reference to 'Heap_PriorityQueue<Passenger>::(insert function for Heap_PriorityQueue class isEmpty, add, etc.)

其次是几个

undefined reference to 'non-virtual thunk to Heap_PriorityQueue<Passenger>::(Heap_PriorityQueue functions again)

不确定如何继续。我是否错误地宣布了?

编辑:

Passenger是另一个用于创建持有乘客数据(名称,行,优先级/密钥等)的Passenger对象的类。

不确定'链接命令'是什么意思(我是学生/新手)但是airworthy.cpp和airworthy.h文件的makefile如下:

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

Airworthy.h如下:

#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

刚刚意识到第一次使用Airworthy构造函数时出现错误,我现在已经空了。这是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()
{
}

尝试在构造函数中包含不同的东西(包括Heap_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

我在我的智慧结束时,我一直试图让这个该死的东西现在工作几个小时。

1 个答案:

答案 0 :(得分:0)

我认为可能的问题是您忘记在Heap_PriorityQueue.cpp的makefile配方中包含Airworthy.o。所以编译器正在查找队列函数的定义,而不是函数本身(这是链接阶段“未定义引用”的含义)

编辑:检查构建过程是否生成Heap_PriorityQueue.o文件,以及此文件是否包含在创建exe的最终命令行中。