创建DLL时遇到两个问题~ 静态数据成员string与向量vector的警告。

neicole 2012-08-04 05:59:57
//class __declspec(dllexport) std::string defaultIp;

//template typename __declspec(dllexport) std::string;

class _declspec(dllexport) ClientSocket: public BaseSocket
{
private:
DataManage * dataManage;
bool hasConnect;

void init(DataManage*);

public:
static std::string defaultIp;
...
};

提示:
1> dllmain.cpp
1>g:\temp\iocp_tcp_socket_encapsulation\v02_iocp_tcp_socket_encapsulation\encapsulation\encapsulation\clientsocket.h(33): warning C4251: “ClientSocket::defaultIp”: class“std::basic_string<_Elem,_Traits,_Ax>”需要有 dll 接口由 class“ClientSocket”的客户端使用
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]



template class __declspec(dllexport) std::vector <BaseSocket>;

class _declspec(dllexport) IocpServerSocket: public ServerSocket
{
private:
HANDLE completionPort; // 完成端口的句柄
std::vector <BaseSocket> * clientGroup; // 创建客户端组
...
}

提示:
1> g:\temp\iocp_tcp_socket_encapsulation\v02_iocp_tcp_socket_encapsulation\encapsulation\encapsulation\iocpserversocket.h(26): 参见对正在编译的类 模板 实例化“std::vector<_Ty>”的引用
1> with
1> [
1> _Ty=BaseSocket
1> ]
1> ClientSocket.cpp
1>g:\temp\iocp_tcp_socket_encapsulation\v02_iocp_tcp_socket_encapsulation\encapsulation\encapsulation\clientsocket.h(33): warning C4251: “ClientSocket::defaultIp”: class“std::basic_string<_Elem,_Traits,_Ax>”需要有 dll 接口由 class“ClientSocket”的客户端使用
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]


按照网上所说的方法加上 template class __declspec(dllexport) std::vector <BaseSocket>; 还是不起作用~


这问题该怎么解决呢?

PS: 这天可能断网,只能用手机上网,可能周一才能结帖~ 不过会用手机留意信息~
...全文
194 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
neicole 2012-08-06
  • 打赏
  • 举报
回复
谢谢大家,看来要想办法替代掉模板了~
许文君 2012-08-06
  • 打赏
  • 举报
回复
不要去导出vector,你可以导出一组接口,作为插入、查询以及导出功能。
redui 2012-08-06
  • 打赏
  • 举报
回复
不要把模板库导出,寻找其它替代方式,比如用成员函数代替stl的数据成员,把模板类型都隐藏起来。导出成员函数的类型和参数都不要用模板类。理由解释过无数遍:因为模板是编译期多态的,在不同模块中可能是完全不同内存布局的类型,虽然冠以相同的名称。
neicole 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
类的静态成员变量,要在类外(cpp中)单独导出。
顺便在dll和客户端交互的部分,不推荐用stl。
[/Quote]

谢谢,不过还是有点问题,能具体说说,试过将
template class __declspec(dllexport) std::vector <BaseSocket>;
这些语句放在CPP文件中,还是出现一样的错误~

还有就是想问一下,将std::strig的静态成员放在cpp该用什么语句呢? 
用template class __declspec(dllexport)的时候会提示错误,可能因为它不需要一个单独的class保存到地址中,然后将它改成 __declspec(dllexport) std::string defaultIp;去掉class还是出现问题。
江南烟雨梦 2012-08-04
  • 打赏
  • 举报
回复
类的静态成员变量,要在类外(cpp中)单独导出。
顺便在dll和客户端交互的部分,不推荐用stl。

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧