2012-08-31 23 views
0

我已经重载了X类型的新运营商使用一些内存池。我的new运算符没有用户定义的参数,因此唯一的参数是size_t类型的对象的大小。在该计划的另一部分,我需要放置新的同类型的,像这样:C++:放置新的冲突与自己的新的过载

new (ptr) X(); 

(其中PTR是一个指向预分配的内存位置)

看来,我的新的过载用于阴影布局类型的新运算符。至少,编译器会抱怨:

error: no matching function for call to ‘X::operator new(long unsigned int, X*&)’ 
note: candidate is: 
note: static void* X::operator new(size_t) 
note: candidate expects 1 argument, 2 provided 

候选者是我的新操作符的重载。我的问题是:

  • 为什么编译器不能识别我想使用放置新?
  • 无论如何,我该如何使用它?
  • WTF是错误信息中显示的类型X*&
+0

X *&是对X *的引用。通过参数返回X *。 http://codepad.org/7vu3r04b –

回答

2

覆盖TypeName :: operator new(size_t)要求您也覆盖放置new操作符(相反不是必需的)。这就是编译器抱怨的原因。 (有道理 - 如果你在分配过程中做了一些奇怪的事情,你可能想在位置new操作符的指定位置执行该操作,反之不一定是这样)。 而X * &仅仅是您想要新对象的指针的引用。

+1

但为什么引用指针而不是指针本身? – gexicide

+0

@gexicide:因为参数是一个左值,它的类型将被推断为引用。 – Grizzly

+0

你能否提供一个理由/为什么会出现这种情况? –