Неопределенная ссылка на деструктор 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();
}
}
Любые идеи будут оценены, это заставило меня почесать голову некоторое время сейчас!