我的模板类Queue遇到了问题,我一直在实现文件中实现这些功能,所以我看到this回答并解决了在头文件中执行的问题:
Queue.hpp
#ifndef QUEUE_HPP
#define QUEUE_HPP
#include "Instruction.hpp"
#include "MicroblazeInstruction.hpp"
#include <memory>
#include <list>
template<typename T>
class Queue{
public:
Queue(unsigned int max): maxSize{max} {};
~Queue();
std::list<T> getQueue(){
return queue;
};
void push(T obj){
if(queue.size() < maxSize){
queue.push_front(obj);
}
else{
queue.pop_back();
queue.push_front(obj);
}
};
private:
Queue(const Queue&);
Queue& operator=(const Queue&);
unsigned int maxSize;
std::list<T> queue;
};
#endif
我从我的主要部门调用此功能:
#include "icm/icmCpuManager.hpp"
#include "Instruction.hpp"
#include "MicroblazeInstruction.hpp"
#include "CpuManager.hpp"
#include "File.hpp"
#include "Utils.hpp"
#include "MbInstructionDecode.hpp"
#include "Queue.hpp"
#include "PatternDetector.hpp"
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <sstream>
#include <cstdint>
#include <memory>
int main(int argc, char *argv[]){
...
// Create pointer to microblaze instruction
std::shared_ptr<MicroblazeInstruction> newMbInstruction;
// Maximum pattern size
const unsigned int maxPatternSize = 300;
// Creating the Queue
Queue<std::shared_ptr<MicroblazeInstruction>> matchingQueue(maxPatternSize);
...
}
我仍然有这个编译错误:
# Linking Platform faith.exe
g++ ./CpuManager.o ./Instruction.o ./File.o ./Utils.o ./MicroblazeInstruction.o ./MbInstructionDecode.o ./PatternDetector.o ./main.o -m32 -LC:\Imperas/bin/Windows32 -lRuntimeLoader -o faith.exe
./main.o:main.cpp:(.text.startup+0x552): undefined reference to `Queue<std::shared_ptr<MicroblazeInstruction> >::~Queue()'
./main.o:main.cpp:(.text.startup+0x83a): undefined reference to `Queue<std::shared_ptr<MicroblazeInstruction> >::~Queue()'
c:/mingw/mingw32/bin/../lib/gcc/i686-w64-mingw32/4.7.0/../../../../i686-w64-mingw32/bin/ld.exe: ./main.o: bad reloc address 0x0 in section `.ctors'
collect2.exe: error: ld returned 1 exit status
makefile:24: recipe for target 'faith.exe' failed
make: *** [faith.exe] Error 1
如果我已经在头文件中指定了实现函数,我不知道为什么会发生这种情况,我该如何处理析构函数?
答案 0 :(得分:3)
~Queue();
与
不同~Queue() {};
第二个实现~Queue
,第一个只是声明它。
您声明了~Queue
,但无法定义它。你的主要破坏Queue
,隐含地调用~Queue
。链接器试图找到它,找不到它,并给你一个错误。
答案 1 :(得分:1)
在C ++中,声明和定义之间有明显的区别。在头文件中,声明了析构函数~Queue()。但是析构函数〜队列的定义无处可寻。编译实际上是成功的,但是在这种情况下链接器会抱怨它是否找不到析构函数的实现。