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们能不能看懂。谢谢!
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们能不能看懂。谢谢!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货