Неопределенная ссылка на деструктор Pimpl только с clang в Linux

Вдохновленный GoTW 101, я решил попробовать применить идиому Pimpl к части библиотеки, над которой я работаю, используя оболочку pimpl, описанную там.

Однако при попытке компиляции я получаю неопределенную ссылку на деструктор этого класса Pimpl. Это происходит только с Clang и только в Linux. Т.е. GCC на Linux и Clang на OSX работают нормально.

Вот код, который не работает:

Заголовочный файл

#ifndef TANK_MUSIC_HPP
#define TANK_MUSIC_HPP

#include <string>
#include "../Utility/Pimpl.hpp"

namespace tank
{

class Music
{
    struct impl;
    Pimpl<impl> data;

public:
    Music(std::string fileName);
    //~Music();

    bool load(std::string fileName);

    void play();
    void pause();
    void stop();
};

}

#endif //TANK_MUSIC_HPP

Исходный файл

#include "Music.hpp"
#include "../System/Game.hpp"
#include <SFML/Audio/Music.hpp>
#include "../Utility/Pimpl_impl.hpp"

namespace tank
{

struct Music::impl {
    sf::Music music;
    bool loaded = false;
};

Music::Music (std::string fileName)
{
    load(fileName);
}

//Removing this comment works, but this shouldn't be necessary should it?
//Music::~Music() = default;

bool Music::load (std::string fileName)
{
    if (data->loaded)
    {
        Game::log << "Music already loaded!" << std::endl;
        return data->loaded;
    }
    data->loaded = data->music.openFromFile(fileName);
    return data->loaded;
}

void Music::play()
{
    data->music.play();
}

void Music::pause()
{
    data->music.pause();
}

void Music::stop()
{
    data->music.stop();
}

}

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

0 ответов

Другие вопросы по тегам