C++ C++;带有静态成员的模板类-未定义引用,而我的静态成员似乎已声明并初始化

C++ C++;带有静态成员的模板类-未定义引用,而我的静态成员似乎已声明并初始化,c++,qt,class,templates,static-members,C++,Qt,Class,Templates,Static Members,我在stackoverflow和其他网站上阅读了很多关于模板类的主题,但我所理解和尝试的都没有成功,所以请让我向您展示我的代码,如果您能告诉我我做错了什么,那将非常好 NB:我知道使用Singleton的不好的做法,但请不要这么说,请假设它只是一个学术练习来使用模板类 图书馆项目: //fsingleton.h #包括 #如果已定义(库) #定义FCORE\u导出Q\u DECL\u导出 #否则 #定义FCORE\u导出Q\u DECL\u导入 #恩迪夫 模板 FCORE_类出口弗辛格尔顿 {

我在stackoverflow和其他网站上阅读了很多关于模板类的主题,但我所理解和尝试的都没有成功,所以请让我向您展示我的代码,如果您能告诉我我做错了什么,那将非常好

NB:我知道使用Singleton的不好的做法,但请不要这么说,请假设它只是一个学术练习来使用模板类


图书馆项目:

//fsingleton.h
#包括
#如果已定义(库)
#定义FCORE\u导出Q\u DECL\u导出
#否则
#定义FCORE\u导出Q\u DECL\u导入
#恩迪夫
模板
FCORE_类出口弗辛格尔顿
{
公众:
静态T*实例();
静态空压井();
受保护的:
静态T*m_实例;
FSingleton();
虚拟的~FSingleton();
私人:
Q_禁用_复制(FSingleton)
};
模板
T*FSingleton::m_instance=Q_NULLPTR;
模板
T*FSingleton::instance()
{
if(m_instance==Q_NULLPTR){
m_实例=新的T();
}
返回m_实例;
}
模板
void FSingleton::kill()
{
删除m_实例;
m_instance=Q_NULLPTR;
}
模板
FSingleton::FSingleton(){}
模板
FSingleton::~FSingleton(){}
这里我在一个库项目中,所以在构建时定义了
LIB\u library
,所以我们有
Q\u DECL\u EXPORT
,并且成功地构建了库


可执行项目:

//testsingleton.h
#包括“fsingleton.h”
类TestSingleton:公共FSingleton
{
公众:
TestSingleton();
虚拟~TestSingleton();
};
//testsingleton.cpp
#包括“testsingleton.h”
TestSingleton::TestSingleton(){}
TestSingleton::~TestSingleton(){}
//tst_utfsingleton.cpp-它是一个遵循Qt测试模板的单元测试源文件,我将其编写为一个简单的main.cpp函数以简化示例
#包括“testsingleton.h”
void main()
{
TestSingleton*ptr1=TestSingleton::instance();
}
此可执行文件在链接时编译失败,并提供以下输出:

../debug/obj/tst_utfsingleton.o: In function `FSingleton<TestSingleton>::instance()':
../lib/fsingleton.h:63: undefined reference to `__imp__ZN10FSingletonI13TestSingletonE10m_instanceE'
../lib/fsingleton.h:64: undefined reference to `__imp__ZN10FSingletonI13TestSingletonE10m_instanceE'
../lib/fsingleton.h:68: undefined reference to `__imp__ZN10FSingletonI13TestSingletonE10m_instanceE'
../debug/obj/testsingleton.o: In function `FSingleton<TestSingleton>::FSingleton()':
../lib/fsingleton.h:79: undefined reference to `__imp__ZTV10FSingletonI13TestSingletonE'
../debug/obj/testsingleton.o: In function `FSingleton<TestSingleton>::~FSingleton()':
../lib/fsingleton.h:88: undefined reference to `__imp__ZTV10FSingletonI13TestSingletonE'
../debug/obj/testsingleton.o: In function `FSingleton<TestSingleton>::~FSingleton()':
../lib/fsingleton.h:88: undefined reference to `__imp__ZTV10FSingletonI13TestSingletonE'
collect2.exe: error: ld returned 1 exit status
。/debug/obj/tst_utfsingleton.o:在函数'FSingleton::instance()'中:
../lib/fsingleton.h:63:对“\uu imp\uu ZN10FSingletonI13TestSingletonE10m\u instanceE”的未定义引用
../lib/fsingleton.h:64:对“\uu imp\uu ZN10FSingletonI13TestSingletonE10m\u instanceE”的未定义引用
../lib/fsingleton.h:68:对“\uu imp\uu ZN10FSingletonI13TestSingletonE10m\u instanceE”的未定义引用
../debug/obj/testsingleton.o:在函数'FSingleton::FSingleton()'中:
../lib/fsingleton.h:79:对“\uu imp\uu ZTV10FSingletonI13TestSingletonE”的未定义引用
../debug/obj/testsingleton.o:在函数“FSingleton::~FSingleton()”中:
../lib/fsingleton.h:88:对“\uu imp\uu ZTV10FSingletonI13TestSingletonE”的未定义引用
../debug/obj/testsingleton.o:在函数“FSingleton::~FSingleton()”中:
../lib/fsingleton.h:88:对“\uu imp\uu ZTV10FSingletonI13TestSingletonE”的未定义引用
collect2.exe:错误:ld返回了1个退出状态
我不太明白为什么所有这些未定义的引用。
m_实例
成员被声明到
FSingleton
类中,并在类定义之后在
FSingleton.h
中初始化。我看不出我做错了什么,你能帮帮我吗


考虑到

正常,因此由于@drescherjm的回答,问题得以解决

据我所知,模板类是在编译时生成的,具体取决于所需的实例化。 因此,在我的例子中,在构建库时,我将模板类
FSingleton
标记为
\uuu declspec(dllexport)
,但我的库中没有实例化,因此不会导出任何内容。 然后,在编译可执行文件时,该类被标记为
\uu declspec(dllimport)
,但因此没有要导入的内容,因为在库构建期间没有构建任何内容,因为实例化
FSingleton
是在可执行源代码中完成的

如果我说错了什么,请不要犹豫纠正我的话^^


再次感谢@drescherjm

FCORE\u EXPORT
我想你不想在模板中使用它。谢谢@drescherjm,你说得对,当我推迟它时,它就成功构建了。但是我承认我并不真正理解非模板类和带有DLL export语句的模板类之间的区别。你能再给我解释一下吗?非常感谢您的解决方案:-)