Неопределенная ссылка на деструктор класса шаблона

У меня была проблема с моей очередью класса шаблона, в которой я реализовывал функции в файле реализации, поэтому я увидел этот ответ и решил выполнить реализацию в заголовочном файле:

Очередь.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

Я не знаю, почему это происходит, если я уже указал функции реализации в заголовочном файле, при чем тут деструктор?


person joaomlap    schedule 22.07.2015    source источник
comment
Где вы реализовали ~Queue()?   -  person Yakk - Adam Nevraumont    schedule 22.07.2015
comment
~Queue() не определено. Вы это определили?   -  person Captain Obvlious    schedule 22.07.2015
comment
Это была ошибка, я сделал ~Queue(){}; но поскольку я не делал никаких изменений в main, он все равно выдавал ту же ошибку.   -  person joaomlap    schedule 22.07.2015


Ответы (2)


~Queue();

не то же самое, что

~Queue() {};

второй реализует ~Queue, первый просто объявляет его.

Вы объявили ~Queue, но нигде не определили его. Ваш main уничтожает Queue, который неявно вызывает ~Queue. Компоновщик пытается его найти, нигде не находит и выдает ошибку.

person Yakk - Adam Nevraumont    schedule 22.07.2015
comment
Это было так, я даже сделал это, но поскольку я не делал никаких изменений в main, он компилировал тот же код, что и раньше. - person joaomlap; 22.07.2015

В C++ существует четкое различие между объявлением и определением. В вашем заголовочном файле объявлен деструктор ~Queue(). Но определения деструктора ~Queue нигде нет. На самом деле компиляция прошла успешно, но компоновщик будет жаловаться, если в этом случае не сможет найти реализацию вашего деструктора.

person Kevin Le - Khnle    schedule 22.07.2015