容器问题,高手请进

suokeng 2003-12-12 10:41:10
我在我的类(.h文件)中定义了
static map<SOCKET,WSAOVERLAPPEDEX>m_CMDClientMap;
后,不在实现文件中使用这个变量就不会出错,但是只要在
实现文件中使用这个变量就会连接出错。
错误如下:
Linking...
FtpCmdHandle.obj : error LNK2001: unresolved external symbol "private: static class std::map<unsigned int,class CWSAOverlappedEx *,struct std::less<unsigned int>,class std::allocator<class CWSAOverlappedEx *> > CFtpCmdHandle::m_CMDClientMap" (?m_CM
DClientMap@CFtpCmdHandle@@0V?$map@IPAVCWSAOverlappedEx@@U?$less@I@std@@V?$allocator@PAVCWSAOverlappedEx@@@3@@std@@A)
Release/myFTPserver.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

myFTPserver.exe - 2 error(s), 0 warning(s)
为什么?
...全文
9 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
suokeng 2003-12-12
晕死,这么简单?
好像是可以了。能不能解释一下。马上给分!!!
为什么申明了变量,在实现文件头部还要定义呢?
  • 打赏
  • 举报
回复
chelsea 2003-12-12
上面写错了,定义时前面没有“static”
  • 打赏
  • 举报
回复
chelsea 2003-12-12
你写的那叫声明,不叫定义

在cpp文件中定义一下就可以了:

static map<SOCKET,WSAOVERLAPPEDEX> YourClass::m_CMDClientMap;
  • 打赏
  • 举报
回复
suokeng 2003-12-12
Do not use static member variables in nested classes of class templates.
-----------这句话如何理解呢?我程序里没有嵌套类啊〉?
  • 打赏
  • 举报
回复
suokeng 2003-12-12
这是微软产品的一个bug
  • 打赏
  • 举报
回复
suokeng 2003-12-12
或者说可以在实现文件中访问,但是一定要把成员的static标志去除掉
  • 打赏
  • 举报
回复
ydshzhy 2003-12-12
1、在头文件中声明 extern map<SOCKET,WSAOVERLAPPEDEX>m_CMDClientMap;
2 在某一实现文件中实现具体实例定义:
map<SOCKET,WSAOVERLAPPEDEX>m_CMDClientMap;

  • 打赏
  • 举报
回复
chelsea 2003-12-12
1,

非static的member随对象一起被分配内存,有多少个对象,member就有多少个

static的member只有一份实例,独立于任何对象,所以不能随任何一个对象初始化,
所以必须有个单独的地方对其分配内存

因此,仅仅声明是不够的,必须定义

2,

定义应该放在cpp中,如果放在头文件中,被包含到多个“编译单元”中,就会重复定义,如果允许,那内存中就有多份实例,所以会被编连器拒绝
  • 打赏
  • 举报
回复
相关推荐
发帖
工具平台和程序库
加入

2.4w+

社区成员

C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
申请成为版主
帖子事件
创建了帖子
2003-12-12 10:41
社区公告
暂无公告