Possible Duplicate:
Why can templates only be implemented in the header file?辛格爾頓C++模板類
我意識到,已經有這樣幾個主題對SO,但我沒有發現任何會回答我的問題。
我一直在使用本教程http://www.codeproject.com/Articles/4750/Singleton-Pattern-A-review-and-analysis-of-existin
但不幸的是我不斷收到錯誤已經寫我的模板單例類:
/home/USER/testcode/cpp_workshop/main.cpp:-1: error: undefined reference to `Singleton::Instance()' :-1: error: collect2: ld
我singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H
template <typename T>
class Singleton
{
public:
static T& Instance();
protected:
virtual ~Singleton();
inline explicit Singleton();
private:
static T* _instance;
static T* CreateInstance();
};
template<typename T>
T* Singleton<T>::_instance = 0;
#endif // SINGLETON_H
singleton.cpp
#include "singleton.h"
#include <cstdlib>
template <typename T>
Singleton<T>::Singleton()
{
assert(Singleton::_instance == 0);
Singleton::_instance = static_cast<T*>(this);
}
template<typename T>
T& Singleton<T>::Instance()
{
if (Singleton::_instance == 0)
{
Singleton::_instance = CreateInstance();
}
return *(Singleton::_instance);
}
template<typename T>
inline T* Singleton<T>::CreateInstance()
{
return new T();
}
template<typename T>
Singleton<T>::~Singleton()
{
if(Singleton::_instance != 0)
{
delete Singleton::_instance;
}
Singleton::_instance = 0;
}
,這就是我怎麼稱呼它(與normall - 不是模板或任何東西 - 類Game
) Singleton<Game>::Instance().run();
你有沒有包含頭文件中main.cpp中? – 2012-07-12 13:23:30
@EamonnMcEvoy是的,我確實包括了它們兩個('game.h'和'singleton.h') – Patryk 2012-07-12 13:25:50
模板函數定義在使用這些函數的地方必須對編譯器可見。因此你不能把它們放在單獨的'.cpp'文件中。 – n0rd 2012-07-12 13:28:54