2011-06-02 20 views
7
namespace X 
{ 
    void* operator new (size_t); 
} 

da mensaje de error como:operador nuevo espacio de nombres dentro

error: ‘void* X::operator new(size_t)’ may not be declared within a namespace 

¿Es un gcc compiler bug? En versiones anteriores de gcc, parece estar funcionando. ¿Alguna idea, por qué no está permitido?

Caso de uso: me querían para permitir sólo a medida operator new/delete para las clases y quería prohibir mundial new/operator. En lugar de error del enlazador, fue fácil detectar el error del compilador; así que codifiqué:

namespace X { 
    void* operator new (size_t); 
} 
using namespace X; 

Esto funcionó para la versión anterior de gcc pero no para la nueva.

+0

¿Duplicado de http://stackoverflow.com/questions/1568168/testoperator-new? – Nemo

+0

Si desea utilizar un operador personalizado para las clases, déles una clase base común con ese operador personalizado. – sharptooth

Respuesta

6

@ respuesta de Dienteafilado tiene más sentido si tenemos en cuenta esta sección de la norma:

3.7.3.1 funciones de asignación [basic.stc.dynamic.allocation]

[.. ] Una función de asignación debe ser una función de miembro de clase o una función global; un programa está mal formado si una función de asignación se declara en un ámbito de espacio de nombres distinto del alcance global o declarado estático en el alcance global. [..]

La limitación anterior se debe probablemente a la razón por la que la respuesta de @ sharptooth apunta.

8

Esto no está permitido porque no tiene sentido. Por ejemplo usted tiene los siguientes

int* ptr = 0; 

namespace X { 
    void* operator new (size_t); 
    void operator delete(void*); 
    void f() 
    { 
     ptr = new int(); 
    } 
} 

void f() 
{ 
    delete ptr; 
    ptr = 0; 
} 

ahora cómo debería ser la ptrdelete d - con el espacio de nombres global operator delete() o con el específico a namespace X? No hay forma posible de que C++ lo deduzca.

+0

He publicado un caso de uso. Puede haber otro caso de uso también donde uno quiera usarlo solo dentro del alcance del 'espacio de nombres'. – iammilind

+0

Consulte la discusión sobre el [informe de error de g ++ al que hizo referencia] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13903). Esto está prohibido por el estándar. – Nemo

+0

+1, estoy de acuerdo con @sharptooth (había pensado en este problema anteriormente, pero estaba usando esta sobrecarga para otro propósito) – iammilind

Cuestiones relacionadas