关于静态空间的问题,个人觉得不简单,高手进来
环境:vc
工程-项目1
项目2
项目1-cppfile-main.cpp
-hfile -无
-lib -eros.lib(为项目2生成文件)
项目2-aa.cpp
aa.h
问了说明问题我把文件改的很简单:
//aa.h
#ifndef _AA_H__
#define _AA_H__
template <typename T> class Singleton
{
protected:
static T* ms_Singleton;
public:
Singleton( void )
{
// assert( !ms_Singleton );
int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
ms_Singleton = (T*)((int)this + offset);
}
~Singleton( void )
{ // assert( ms_Singleton );
ms_Singleton = 0; }
static T& getSingleton( void )
{ //assert( ms_Singleton );
return ( *ms_Singleton ); }
static T* getSingletonPtr( void )
{ return ( ms_Singleton ); }
};
class __declspec( dllexport ) AA:public Singleton<AA>
{
public:
};
#endif
//--------------------------------------------------
//aa.cpp
#include "aa.h"
template<> AA *Singleton<AA>::ms_Singleton=0;
//-------------------------------------------------
//main.cpp
#include "aa.h"
void main()
{
AA a;
}
项目2生成名为erosmain.dll和eros.lib正常。
项目1在连接eros.lib出错:
Linking...
Creating library Debug/test.lib and object Debug/test.exp
main.obj : error LNK2001: unresolved external symbol "protected: static class AA * Singleton<class AA>::ms_Singleton" (?ms_Singleton@?$Singleton@VAA@@@@1PAVAA@@A)
Debug/test.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
但是实际上正如你所看到的在aa.cpp中已经给静态变量初值了。