我正在尝试定义一个可以传递“对象分配器”函数的类,并将模板对象的运算符new()作为默认参数。我有以下代码:
template<class _Obj>
class Foo
{
private:
typedef _Obj (_Obj::*fp_alloc_type)();
public:
Foo(fp_alloc_type t=_Obj::operator new ());
...
};
这给出了一个编辑错误C2039:'new':不是'SomeObj'的成员
编译器是否为没有定义自己的对象生成'new'的默认实现?我错过了什么吗?
答案 0 :(得分:0)
无论它是什么,operator new
功能不是
任何类的非静态成员函数。即使你宣布
并且定义了一个特定于类的运算符new,它被认为是
静态成员函数;如果需要一个,size_t
参数,然后指向它的指针将是void* (*ptrToNew)(
size_t )
。 (如果它是一个新的位置,当然会有
更多的论点。)
执行new Foo
时,编译器会对其进行名称查找
operator new
首先在Foo
范围内{如果Foo
是一个类
type),然后在全局命名空间中。 (有趣的是,
编译器将不查看Foo
所在的命名空间
声明。 ADL也不适用。一个operator new
函数
在全局命名空间以外的命名空间中永远不会
发现。)除非你在课堂上宣布operator new
,
将使用全局operator new
函数。