Присвояване на оператор new() към указател на функция?

Опитвам се да дефинирам клас, който може да получи функция за разпределение на обекти и приема оператора 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'

Компилаторът не генерира ли имплементация по подразбиране на „нов“ за обекти, които не дефинират собствените си? Изпускам ли нещо?


person jwalk    schedule 28.03.2013    source източник
comment
да Компилаторът не генерира operator new за вашия клас. Откъде ти хрумна тази идея?   -  person Nawaz    schedule 28.03.2013
comment
Тогава защо мога да извикам new _Obj()? Това не е ли _Obj::operator new()?   -  person jwalk    schedule 28.03.2013
comment
@jwalk, не. Това е глобално ново. ::operator new()   -  person StoryTeller - Unslander Monica    schedule 28.03.2013
comment
C++ вече няма ли клас за разпределение? template < class T > class allocator   -  person andre    schedule 28.03.2013
comment
Тази предишна тема може да бъде полезна: stackoverflow.com/questions/1885849/   -  person Shafik Yaghmour    schedule 28.03.2013
comment
@StoryTeller Или не. Компилаторът следва много специфични правила за търсене на име тук, които са малко по-различни от тези на всяка друга функция (тъй като игнорират всички пространства от имена, които съдържат класа). Но е възможно да скриете глобалния operator new. Разбира се, ако програмистът напише ::new Foo, той ще използва ::operator new() независимо от това.   -  person James Kanze    schedule 28.03.2013


Отговори (1)


Каквото и да е, функцията operator new не е нестатична функция-член на който и да е клас. Дори ако декларирате и дефинирате специфичен за клас оператор new, той се счита за статична функция-член; ако приема единичен size_t аргумент, тогава указател към него ще бъде void* (*ptrToNew)( size_t ). (Ако това е ново разположение, разбира се, ще има повече аргументи.)

Когато правите new Foo, компилаторът прави търсене на име на operator new първо в обхвата на Foo (ако Foo е тип клас), след това в глобалното пространство от имена. (Интересното е, че компилаторът няма да търси в пространството от имена, в което е декларирано Foo. Нито пък ADL някога се прилага. Функция operator new в пространство от имена, различно от глобалното пространство от имена, никога няма да бъде намерена.) Освен ако не сте декларирали operator new в класа, ще се използва глобалната функция operator new.

person James Kanze    schedule 28.03.2013
comment
Просто като продължение, тогава предполагам, че няма стандартен начин да вземете указател към изпълнението на новия оператор на обекта? - person jwalk; 28.03.2013
comment
@jwalk Обектът няма имплементация на функцията operator new. Ако има специфичен за клас operator new, void* (*ptrNew)( size_t ) = &Foo::operator new трябва да работи. Ако не знаете дали има специфичен за клас operator new, ще ви трябва някакъв вид мета програмиране, за да разберете. Но защо го искаш? - person James Kanze; 28.03.2013
comment
Беше ми интересно да напиша имплементация на модел на набор от обекти, който приема незадължителен аргумент в конструктора за метод за разпределение на обектите в пула. - person jwalk; 28.03.2013