谁能帮我解释一下为什么new后面有两个参数,开源代码中几个类定义,谢谢!

weakwater 2009-02-22 01:04:54
webkit中的几个类定义:
template<bool isInteger, typename T> struct GenericHashTraitsBase;

template<typename T> struct GenericHashTraitsBase<false, T> {
static const bool emptyValueIsZero = false;
static const bool needsDestruction = true;
};

// Default integer traits disallow both 0 and -1 as keys (max value instead of -1 for unsigned).
template<typename T> struct GenericHashTraitsBase<true, T> {
static const bool emptyValueIsZero = true;
static const bool needsDestruction = false;
static void constructDeletedValue(T& slot) { slot = static_cast<T>(-1); }
static bool isDeletedValue(T value) { return value == static_cast<T>(-1); }
};


template<typename T> struct GenericHashTraits : GenericHashTraitsBase<IsInteger<T>::value, T> {
typedef T TraitType;
static T emptyValue() { return T(); }
};


struct FormElementKeyHashTraits : WTF::GenericHashTraits<FormElementKey> {
static void constructDeletedValue(FormElementKey& slot) { new (&slot) FormElementKey(WTF::HashTableDeletedValue); }
static bool isDeletedValue(const FormElementKey& value) { return value.isHashTableDeletedValue(); }
};


可以看出 FormElementKeyHashTraits 继承自GenericHashTraits 又继承自GenericHashTraitsBase

GenericHashTraitsBase有两个定义分别对应第一个参数是true和false

问题就是那段橙色代码中的new (&slot) FormElementKey(WTF::HashTableDeletedValue); 出错了:
error C2661: “operator new”: 没有重载函数接受 2 个参数

其中WTF::HashTableDeletedValue是一个枚举变量值,值为0

请问,这个new后面有两个单数是啥意思?怎么解决?

以上代码如果不够我可以再贴,期待高手指点!
...全文
154 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdlrobin 2009-02-22
  • 打赏
  • 举报
回复
new(放置地址)类型(构造参数)这样解释可以吗?
例如new(0x0f0f0f0f)char('w');
weakwater 2009-02-22
  • 打赏
  • 举报
回复
多谢各位

真是学海无涯啊
lei_zhuyan 2009-02-22
  • 打赏
  • 举报
回复
UP
机智的呆呆 2009-02-22
  • 打赏
  • 举报
回复
百度placement new
zhuxueling 2009-02-22
  • 打赏
  • 举报
回复
FormElementKey
可能是这个类的声明有问题。
weakwater 2009-02-22
  • 打赏
  • 举报
回复
3楼,从它的父类来看,没有重载new,如果重载估计也不会出现这个错误
zhuxueling 2009-02-22
  • 打赏
  • 举报
回复
比如,
class A{};
new A; 这个new得到一个参数,就是sizeof(A)

A *p;
new (p)A; 这个new得到2个参数,一个是p,一个是sizeof(A)

new看上去像是一个关键字,实际是一个函数,更确切的说,是一个运算符,和+,-,*,/是一样的。
(但操作符又是函数,比如operator +)
在new这个文件中声明的,

后面那个很怪的,叫放置式语法,指的是,新生成的对象,并不是随机分配的地址,而是使用地址p。
在tcpl这本书里讲到了。






waizqfor 2009-02-22
  • 打赏
  • 举报
回复
原来我也遇到过 看看这个
http://support.microsoft.com/kb/143207/zh-cn
netsocket 2009-02-22
  • 打赏
  • 举报
回复
mark

64,639

社区成员

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

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