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

Template with OO caused unresolved external symbol issue

本文关键字:未解决 外部 符号 问题 OO 带有      更新时间:2023-10-16

我没有.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)

它是类中的静态变量。您只在标头中声明它,但您还需要在 cpp 文件中定义它。这意味着您必须在 cpp 中包含模板静态成员。

例如,在您的 cpp 文件中执行以下操作:

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

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