|
|
1、新建一个DLL工程,里面有两个类:ResManager 和 Singleton
// Singleton.h
template <typename T> class Singleton
{
protected:
static T* ms_Singleton;
public:
Singleton( void )
{
……
}
~Singleton( void )
{
……
}
static T& GetSingleton( void )
{
……
}
static T* GetSingletonPtr( void )
{
……
}
}
// ResManager.h
#include "Singleton.h"
class __declspec( dllexport ) ResManager: public Singleton<ResManager>
{
public:
ResManager(void);
~ResManager(void);
public:
static ResManager& GetSingleton(void);
static ResManager* GetSingletonPtr(void);
……
……
}
// ResManager.cpp
#include "ResManager.h"
template<> ResManager* Singleton<ResManager>::ms_Singleton = 0;
ResManager* ResManager::GetSingletonPtr(void)
{
return ms_Singleton;
}
ResManager& ResManager::GetSingleton(void)
{
assert( ms_Singleton );
return ( *ms_Singleton );
}
ResManager::ResManager(void)
{
……
}
ResManager::~ResManager(void)
{
……
}
……
……
编译成功,没有问题。
////////////////////////////////////////////////////////
2、新建一个Win32程序的工程 MyTest
// MyTest.h
#include "ResManager.h"
#pragma comment( lib, "ResManager.lib" )
……
……
// MyTest.cpp
……
ResManager *pResMgr = new ResManager();
……
编译失败,提示:
stdafx.obj : error LNK2001: 无法解析的外部符号 "protected: static class ResManager * Singleton<class ResManager>::ms_Singleton" (?ms_Singleton@?$Singleton@VResManager@1PAVResManager@2@A)
Debug/MyTest.exe : fatal error LNK1120: 1 个无法解析的外部命令
问题一:请问这里编译失败是什么原因?
////////////////////////////////////////////////////
3、如果把 Singleton 类声明改为:
// Singleton.h
template <typename T> class __declspec( dllexport ) Singleton
{
……
……
}
此时DLL编译成功,MyTest.exe也编译成功。
//////////////////////////////////////////////////////
4、如果为ResManager类添加一个std::string的变量
// ResManager.h
#include "Singleton.h"
class __declspec( dllexport ) ResManager: public Singleton<ResManager>
{
public:
ResManager(void);
~ResManager(void);
public:
static ResManager& GetSingleton(void);
static ResManager* GetSingletonPtr(void);
……
……
private:
std::string m_strName;
……
}
此时 DLL 编译成功,MyTest.exe 编译失败,提示和前面的错误一样:
stdafx.obj : error LNK2001: 无法解析的外部符号 "protected: static class ResManager * Singleton<class ResManager>::ms_Singleton" (?ms_Singleton@?$Singleton@VResManager@1PAVResManager@2@A)
Debug/MyTest.exe : fatal error LNK1120: 1 个无法解析的外部命令
问题二:请问这里编译出错是什么原因?该如何解决?前者不添加这个std::string的变量就OK,添加了之后,后者就编译通不过。
写得有点乱,不知道DX们能不能看懂。
谢谢!
//////////////////////////////////////////////////////////////
该问题的DLL和EXE工程源代码在附件中!
////////////////////////////////////////////////////////////// |
|