c++ - 对象在头文件中列出,但在 cpp 文件中 undefined reference

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

在类中,在我的头文件中,在类的私有(private)部分中我有

 Heap_PriorityQueue<Passenger> oldBoardingQueue;

为了安全起见,我在 header 和 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

我已经无计可施了,几个小时以来我一直在努力让这个该死的东西工作。

最佳答案

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

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

关于c++ - 对象在头文件中列出,但在 cpp 文件中 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30084253/

相关文章:

java - CPU日志解析、分组和报告

c++ - 访问另一个插件中的类时出错(错误 : undefined reference)

c++ - 在 Visual Studio 的解决方案资源管理器中组织项目文件

c++ - clang 3.1 看不到 unique_ptr?

java - 我的 Java 堆排序代码有什么问题?

java - 使用 Java PriorityQueue 实现级别顺序遍历二叉搜索树时出错

c++ - 静态非成员变量,对程序中的所有线程来说都是同一个变量吗?

c++ - 为什么创建堆数组的时间复杂度不是O(log(n!))而是O(nlogn)?

java - 优先队列实现堆

java - 删除函数如何处理包含字符串值的最小优先级队列?