vc2002下几个编译错误问题

sunmoonfly 2011-05-29 10:31:53
我用vc2002+objectarx2006做二次开发 ,不知道为何报了很多错误,同样的代码在vc2005和vc2008运行正常 ,下面是错误:

正在编译...
Utils.cpp
e:\software\Microsoft Visual Studio .NET\Vc7\include\xmemory(42) : error C2661: “AcHeapOperators::operator new” : 没有重载函数接受 2 个参数
e:\software\Microsoft Visual Studio .NET\Vc7\include\xmemory(127) : 参见对正在编译的函数模板实例化“void std::_Construct(_T1 *,const AcDbExtents &)”的引用
with
[
_T1=AcDbExtents
]
e:\software\Microsoft Visual Studio .NET\Vc7\include\xmemory(126) : 编译类模板成员函数“void std::allocator<_Ty>::construct(std::allocator<_Ty>::pointer,const AcDbExtents &)”时
with
[
_Ty=AcDbExtents
]
e:\software\Microsoft Visual Studio .NET\Vc7\include\vector(19) : 参见对正在编译的类模板实例化“std::allocator<_Ty>”的引用
with
[
_Ty=AcDbExtents
]
e:\software\Microsoft Visual Studio .NET\Vc7\include\vector(35) : 参见对正在编译的类模板实例化“std::_Vector_val<_Ty,_Alloc>”的引用
with
[
_Ty=AcDbExtents,
_Alloc=std::allocator<AcDbExtents>
]
d:\current\图签识别\非框选集成版本\2002\LabelIdentify\Utils.h(236) : 参见对正在编译的类模板实例化“std::vector<_Ty,_Ax>”的引用
with
[
_Ty=AcDbExtents,
_Ax=std::allocator<AcDbExtents>
]


---------------------------------------------------------------------------------------------
请了解的各位指点一下,谢谢
...全文
98 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunmoonfly 2011-06-10
  • 打赏
  • 举报
回复
换了个方法处理
ryfdizuo 2011-06-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mingfei200169 的回复:]

谢谢各位热情帮忙,前几天调试其他程序去了,


我只是这样定义了一些向量数组,vector<AcDbExtents>vecSorted;
[/Quote]
那应该不至于报哪些错误啊,
sunmoonfly 2011-06-06
  • 打赏
  • 举报
回复
谢谢各位热情帮忙,前几天调试其他程序去了,


我只是这样定义了一些向量数组,vector<AcDbExtents>vecSorted;

downmooner 2011-05-30
  • 打赏
  • 举报
回复
new数组的时候 如果new的类型有 non-trivial 析构函数,则 申请到的地址 前面4字节填充数组的个数。
ryfdizuo 2011-05-30
  • 打赏
  • 举报
回复
估计你new的时候,构造函数参数不对、
老邓 2011-05-29
  • 打赏
  • 举报
回复
参考下:

一、重载全局的new 和delete 操作符
可以很容易地重载new 和 delete 操作符,如下所示:

void * operator new(size_t size)
{
void *p = malloc(size);
return (p);
}
void operator delete(void *p);
{
free(p);
}

这段代码可以代替默认的操作符来满足内存分配的请求。出于解释C++的目的,我们也可以直接调用malloc() 和free()。
也可以对单个类的new 和 delete 操作符重载。这是你能灵活的控制对象的内存分配。

class TestClass
{
public:
void * operator new(size_t size);
void operator delete(void *p);
// .. other members here ...
};
void *TestClass::operator new(size_t size)
{
void *p = malloc(size); // Replace this with alternative allocator
return (p);
}
void TestClass::operator delete(void *p)
{
free(p); // Replace this with alternative de-allocator
}

所有TestClass 对象的内存分配都采用这段代码。更进一步,任何从TestClass继承的类也都采用这一方式,除非它自己也重载了new和delete操作符。通过重载new和delete操作符的方法,你可以自由地采用不同的分配策略,从不同的内存池中分配不同的类对象。

二、为单个的类重载new[]和delete[]
必须小心对象数组的分配。你可能希望调用到被你重载过的new和delete操作符,但并不如此。内存的请求被定向到全局的new[]和delete[]操作符,而这些内存来自于系统堆。
C++将对象数组的内存分配作为一个单独的操作,而不同于单个对象的内存分配。为了改变这种方式,你同样需要重载new[]和delete[]操作符。

class TestClass
{
public:
void * operator new[ ](size_t size);
void operator delete[ ](void *p);
// .. other members here ..
};
void *TestClass::operator new[ ](size_t size)
{
void *p = malloc(size);
return (p);
}
void TestClass::operator delete[ ](void *p)
{
free(p);
}
int main(void)
{
TestClass *p = new TestClass[10];
// ... etc ...
delete[ ] p;
}

但是注意:对于多数C++的实现,new[]操作符中的个数参数是数组的大小加上额外的存储对象数目的一些字节。在你的内存分配机制重要考虑的这一点。你应该尽量避免分配对象数组,从而使你的内存分配策略简单。
老邓 2011-05-29
  • 打赏
  • 举报
回复
http://www.baisi.net/viewthread.php?tid=2243753
这里讨论的应该就是你现在的这个问题。
看起来应该是operator new []没有重载。
老邓 2011-05-29
  • 打赏
  • 举报
回复
2002?没听说过。
只听过VS2003。

应该是编译器不兼容:在VS2005之前,对C++的标准,MSVC的编译器支持的不太好的!

64,648

社区成员

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

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