在类中,在我的头文件中,在类的私有(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/