У меня есть шаблонный класс с именем PooledResource
.Он обрабатывает для меня такие вещи, как текстуры и звуки, и гарантирует, что я не загружу один и тот же несколько раз при аварии.Ресурсы определенного типа всегда будут находиться в определенном подкаталоге, и я хотел упростить их загрузку, поэтому я решил добавить статическую переменную, которая отслеживает корневую папку для определенного типа ресурса.
template <typename T>
class PooledResource
{
public:
// ...
static const char* PathPrefix;
static ResourceTable myResourceTable;
static void load(const char* filename)
{
// Any attempt to use PathPrefix in here causes a compilation error
// All I want to do is use PathPrefix and filename to get the full
// path do a file and load it.
}
};
template <typename T>
const char* PooledResource<T>::PathPrefix = NULL;
template <typename T>
typename PooledResource<T>::ResourceTable PooledResource<T>::myResourceTable;
Идея состоит в том, что я могу использовать версию этого типа для различных типов.Например, в PooledTexture.hpp
у меня будет:
typedef PooledResource<Texture> PooledTexture;
, а в PooledTexture.cpp
у меня будет:
template <>
const char* PooledTexture::PathPrefix = "../assets/textures/";
Это все скомпилируется и будет работать нормально, если я этого не сделаюпопытайтесь использовать PathPrefix в функции загрузки выше.Однако, как только я его использую, я получаю такие ошибки:
90 || CMakeFiles/game.dir/PooledTexture.cpp.o:(.data+0x0): multiple definition of `ag::PooledResource<sf::Texture>::PathPrefix'
91 CMakeFiles/game.dir/lua/LuaFrame.cpp.o:/usr/include/c++/4.6/i686-linux-gnu/./bits/gthr-default.h|241| first defined here
Я попытался воспроизвести это в более простом случае, чтобы попытаться выследить проблему, но другие случаи, которые я пробую, похоже, работают.Я не уверен, что я делаю здесь по-другому, что может привести к этой ошибке.