带有OO的模板导致未解决的外部符号问题

时间:2014-12-30 04:02:54

标签: c++ templates

我没有.cpp文件因为我正在使用模板。 但我仍然遇到了未解决的外部符号问题。 有人知道原因吗?非常感谢你能帮助我。

template<class T>
class SQLiteHelper
{
public:
    static SQLiteHelper<T>* getInstance(T* factory) 
    {
        if (NULL == m_sInstance)
        {
            m_sInstance = new SQLiteHelper<T>(factory);
        }
        return m_sInstance;
    }
private:
    SQLiteHelper<T>(T* factory) { m_factory = factory; }
private:
    static SQLiteHelper<T>* m_sInstance;
    sqlite3* m_database;
    T* m_factory;
    std::string m_dbPath;
};

当我打电话时问题就出现了:

AudioItem item;
AudioDBHelper<AudioItem>::getInstance(&item);

问题:

error LNK2001: unresolved external symbol \"private: static class SQLiteHelper<class AudioItem> * SQLiteHelper<class AudioItem>::m_sInstance" (?m_sInstance@?$SQLiteHelper@VAudioItem@@@@0PAV1@A)

1 个答案:

答案 0 :(得分:3)

这是你班上的静态变量。您只需在头文件中声明它,但您还需要在cpp文件中定义它。这意味着您必须在cpp。

中包含模板静态成员

E.g。在你的cpp文件中执行以下操作:

template <class T>
SQLiteHelper<T>* SQLiteHelper<T>::m_sInstance;

必须使用.cpp文件才能工作;它在哪里并不重要,但编译器必须能够找到静态模板实例的定义。