2009-10-14 6 views
1

J'ai essayé de mettre en œuvre ce:Test :: opérateur new

namespace Test 
{ 
    void* operator new(size_t s) 
    { 
     return malloc(s); 
    } 
} 

Mais g ++ (4.3.1) dit:

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

Est-ce que je fais quelque chose de mal?

Si oui, est-il possible de surcharger le nouvel opérateur à utiliser dans mes classes? Je ne veux pas créer une classe de base et faire en sorte que toutes mes classes héritent de cette classe de base.

+3

Le diagnostic est bizarre, car l'opérateur new * peut * être déclaré dans l'espace de noms global. Mais seulement là :) –

+0

donc vous dites que par la conception de la langue, je peux juste surcharger l'opérateur nouveau dans l'espace de noms global, non? – ebasconp

+0

Par conception de langage, vous pouvez déclarer 'operator new' dans l'espace de noms global et en tant que membre d'une classe. – AnT

Répondre

6

Vous pouvez uniquement (re) définir operator new en tant que membre de l'espace de noms global ou en tant que membre (implicitement statique) d'une classe.

Si vous n'avez pas de classe de base commune, vous devez définir operator new pour chaque classe pour laquelle vous souhaitez une implémentation spécialisée. Vous pourriez, bien sûr, déléguer à une fonction globale commune.

3

Oui, vous faites quelque chose de mal. Selon le §3.7.3.1/1 de la norme, "Une fonction d'allocation doit être une fonction membre de classe ou une fonction globale, un programme est mal formé si une fonction d'allocation est déclarée dans un domaine d'espace de noms autre que la portée globale ou déclarée. statique dans la portée globale. "

Cela ne semble pas permettre ce que vous voulez.

0

Eh bien, le compilateur vous a déjà dit exactement ce que vous faites mal. L'opérateur autonome new ne peut être déclaré dans aucun espace de noms autre que l'espace de noms global. Pourquoi avez-vous décidé de le déclarer dans 'namespace Test' sur Terre? Qu'est-ce que vous essayez d'obtenir par ceci?

+1

On pourrait supposer naïvement que l'ADL s'applique à l'opérateur new, et donc que si vous définissez operator new dans l'espace de noms Test, alors toutes les classes de l'espace de noms Test l'utiliseront. –