2009-09-28 7 views
1

Disons que j'ai cette classe:Comment résoudre la surcharge de fonction ambiguë en raison de constructeur par défaut dans le paramètre

class Foo { 
public: 
    void member(std::string s); 
    void member(int64_t &n); 
}; 

Maintenant, je veux faire quelque chose comme

int64_t value = 5; 
Foo f; 
f.member(value); 

Le problème est que le compilateur (au moins GCC) est confus & estime que j'essaie d'appeler membre avec une chaîne en utilisant le constructeur char *:

 
invalid conversion from 'int64_t' to 'const char* 

Comment appeler la fonction membre actuelle sans modifier la signature de la méthode? Les templates sont-ils la seule solution? J'ai essayé de lancer sans aide (ce qui ne devrait pas avoir d'importance puisque le type est déjà sans ambiguïté).


Désolé - trouvez l'erreur.

La déclaration a été:

class Foo { 
public: 
    void member(std::string s); 
    void member(int64_t &n); 
}; 

Retrait de la sous-ref résolu.

+2

Je ne peux pas reproduire l'erreur avec GCC 3.3, 4.2 ou 4.4 sur Ubuntu ni avec GCC 3.4 sur Solaris 10. –

+0

Vous avez raison - pour une raison quelconque, mes tentatives de réduire à un cas simple ont échoué. C'était une erreur de compilateur avec mon code réel cependant - peut-être que j'ai manqué quelque chose d'autre. – Vitali

+0

Maintenant avec le changement de 'int64_t &' cela n'a plus de sens pour moi pourquoi il ne devrait pas compiler. –

Répondre

5

Cast l'argument pour correspondre exactement le type d'argument de la surcharge que vous voulez:

f.member((int64_t) value); 
+0

Cela est redondant si vous transmettez déjà une variable avec le type correct. – Vitali

+0

Cela ne fonctionnera pas parce qu'il a un paramètre de référence non-const, cependant. –

+0

@unknown: Mais il ne passe pas le bon type. Le paramètre doit être __int64_t__ il passe __uint64_t__ –

-1

Il peut y avoir des moyens plus faciles à résoudre ce (comme avec un casting de paramètres) mais j'ai vu des solutions qui ressemblent à la suivant:

void (Foo::*memberProc)(int64_t) = &Foo::member; 

Foo f; 
((f).*(memberProc))(5); 

Torturé, oui, mais c'est explicite.

+0

Laid. Je préférerais me fendre les poignets plutôt que d'utiliser une telle solution. –

0

Désolé - vous avez trouvé l'erreur.

La déclaration a été:

class Foo { 
public: 
    void member(std::string s); 
    void member(int64_t &n); 
}; 

Retrait de la sous-ref résolu.

+1

Vous avez changé la signature de la méthode que vous avez dit que vous ne vouliez pas faire ... ah bien – fbrereto

+0

Ouais, je suppose. Je pensais plutôt à changer le nom de la fonction. Il n'est toujours pas clair pour moi pourquoi le compilateur devenait confus (seulement dans mon code - mes tentatives pour réduire le code à un exemple ont échoué). – Vitali

Questions connexes