对模板类析构函数的未定义引用

时间:2015-07-22 18:16:49

标签: c++ templates

我的模板类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

如果我已经在头文件中指定了实现函数,我不知道为什么会发生这种情况,我该如何处理析构函数?

2 个答案:

答案 0 :(得分:3)

~Queue();

不同
~Queue() {};

第二个实现~Queue,第一个只是声明它。

您声明了~Queue,但无法定义它。你的主要破坏Queue,隐含地调用~Queue。链接器试图找到它,找不到它,并给你一个错误。

答案 1 :(得分:1)

在C ++中,声明和定义之间有明显的区别。在头文件中,声明了析构函数~Queue()。但是析构函数〜队列的定义无处可寻。编译实际上是成功的,但是在这种情况下链接器会抱怨它是否找不到析构函数的实现。