【紧急求助】标准库basic_string的派生类无法在dll中使用

风之子赛拉飞尔 2007-07-03 11:22:02
我从标准库basic_string派生了一个类,如下:

template <class _Elem, class _Traits, class _Ax>
class basic_string_ex
: public basic_string<_Elem, _Traits, _Ax>
...


在exe工程中使用没有问题。
在dll工程中使用编译时总报错,大意是basic_string的一个静态成员npos未定义。
当我显示定义npos时,又报错npos重定义。

不知这一问题该如何解决,谢谢大家。
...全文
195 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
妍妍 2007-07-03
  • 打赏
  • 举报
回复
static const size_type npos = -1;
npos是basic_string的一个typedef,在头文件<string>中
妍妍 2007-07-03
  • 打赏
  • 举报
回复
basic_string提供的功能不能满足你的需求吗
taodm 2007-07-03
  • 打赏
  • 举报
回复
贴代码。
另外,从string派生不是个好主意。
  • 打赏
  • 举报
回复
To 光明使者:

只有这样派生工作量最小哇 :(
  • 打赏
  • 举报
回复
不好意思,应该是链接时报无法解析的外部符号
妍妍 2007-07-03
  • 打赏
  • 举报
回复
basic_string是一个没有虚函数的类,无意作为其他派生类的基类
  • 打赏
  • 举报
回复
补充:我用的是VS2005。
lidongri 2007-07-03
  • 打赏
  • 举报
回复
呵呵,好
解决了就好。
顺便学习一下
  • 打赏
  • 举报
回复
终于找到原因了,呼~呼~,散分:)

问题与我派生的字串类无关。

仔细分析报错提示后发现,“无法解析”的是一个特殊的Basic_string子类:
class _CRTIMP2_PURE _DebugHeapString
: public basic_string<char, char_traits<char>, _DebugHeapAllocator<char> >

费了一番功夫后终于查到是我从basic_iostream派生的basic_fstream_t用了这个类。当时写这些代码时用的还是VS2003,而VS2005的basic_fstream已经不再用_DebugHeapString了。
  • 打赏
  • 举报
回复
To ReverseEngineering:模板类跟库没关系吧:)

To 海浪:不是包含模板,也不是导出模板类,只是在dll工程中使用模板类。


其实这个问题的原因很清楚,就是说类的静态成员必须在cpp中声明,也就是说类的非常量静态成员相当于全局变量,必须依赖于一个模块。这样才能保证在不同的模块中使用这个类时这个量唯一。

但是常量静态成员应该不用依赖于模块,而且直接使用basic_string自己也没有问题。
所以我才想不通 :(
  • 打赏
  • 举报
回复
To 光明使者:确实不能满足我的需求 :(

To 星羽:我在问题描述中说了,在exe工程中用没有问题:)

我怀疑跟模板的实例化或部分实例化有关,于是试了将基类做为类模板参数,也不行。
真搞不懂直接用basic_string怎么就没问题 :(
lidongri 2007-07-03
  • 打赏
  • 举报
回复
DLL貌似不可以包含模板吧,知道的朋友说说看
ReverseEngineering 2007-07-03
  • 打赏
  • 举报
回复
无法解决外部应用,那就是库没包含吧?
星羽 2007-07-03
  • 打赏
  • 举报
回复
#include "iostream"


using namespace std;

template <class _Elem, class _Traits, class _Ax>
class basic_string_ex
: public basic_string<_Elem, _Traits, _Ax>
{

};

int main()
{
basic_string_ex<char, char_traits<char>, allocator<char> > a;

return 0;
}


可以啊,不过没在dll里试

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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