0

我正在尝试定义一个可以传递“对象分配器”函数并将模板对象的运算符 new() 作为默认参数的类。我有以下代码:

template<class _Obj>
class Foo
{
private:
    typedef _Obj (_Obj::*fp_alloc_type)();

public:
    Foo(fp_alloc_type t=_Obj::operator new ());

...
};

这给出了一个编译器错误 C2039: 'new' : is not a member of 'SomeObj'

编译器不会为没有定义自己的对象生成“新”的默认实现吗?我错过了什么吗?

4

1 回答 1

0

无论它是什么,该operator new函数都不 是任何类的非静态成员函数。即使您声明并定义了一个特定于类的运算符 new,它也被视为静态成员函数;如果它需要一个size_t 参数,那么指向它的指针就是void* (*ptrToNew)( size_t ). (如果是新的安置,当然会有更多的争论。)

当您这样做new Foo时,编译器 首先在(如果是类类型)operator new的范围内进行名称查找,然后在全局命名空间中进行名称查找。(有趣的是,编译器不会在声明的命名空间中查找。ADL 也不会应用。在全局命名空间之外的命名空间中的函数永远不会被发现。)除非您在类中声明了 an,否则将使用全局函数。FooFooFoooperator newoperator newoperator new

于 2013-03-28T13:52:12.053 回答