2010-12-01 13 views
1

J'ai quatre fonctions:appel Ambigu à une fonction

template<class Exception,class Argument> 
void allocate_help(const Argument& arg,Int2Type<true>)const; 

template<class Exception,class Argument> 
std::nullptr_t allocate_help(const Argument& arg,Int2Type<false>)const; 

template<class Exception> 
void allocate_help(const Exception& ex,Int2Type<true>)const; 

template<class Exception> 
std::nullptr_t allocate_help(const Exception& ex,Int2Type<false>)const; 

mais quand je l'appelle:

allocate_help<std::bad_alloc>(e,Int2Type<true>()); //here e is of a std::bad_alloc type 

Je reçois une erreur:
Erreur 3 Erreur C2668: appel ambigu à une surcharge Fonction Pourquoi?

Répondre

2

Parce que votre appel correspond à la fois:

template<class Exception,class Argument> 
void allocate_help(const Argument& arg,Int2Type<true>)const; 

avec Exception = std::bad_alloc et Argument = std::bad_alloc (Argument est déduit automatiquement), et:

template<class Exception> 
void allocate_help(const Exception& ex,Int2Type<true>)const; 

avec Exception = std::bad_alloc. D'où l'ambiguïté de l'appel.

Aussi je pense que votre compilateur devrait sortir toute la fonction correspondante après la ligne d'erreur, ainsi vous pourriez répondre à votre question vous-même.

2

Parce qu'ils sont ambigieux.

template<class Exception,class Argument> 
std::nullptr_t allocate_help(const Argument& arg,Int2Type<true>)const; 

template<class Exception> 
std::nullptr_t allocate_help(const Exception& ex,Int2Type<true>)const; 

La signature de la deuxième fonction est un sous-ensemble de la première, ce qui signifie que dans le cadre de l'appel de la fonction, ils sont les mêmes de prendre « tout type » comme premier argument et Int2Type comme second argument.

allocate_help<std::bad_alloc>(e,Int2Type<true>()); 

peut devenir soit:

std::nullptr_t allocate_help<std::bad_alloc, std::bad_alloc>(const std::bad_alloc& arg,Int2Type<true>)const; 

ou

std::nullptr_t allocate_help<std::bad_alloc>(const std::bad_alloc& ex,Int2Type<true>)const; 

Comment le compilateur choisir?

+1

+1, mais ils n'ont pas exactement la même signature, la deuxième version est un sous-ensemble de la première, où les types 'Exception' et' Argument' sont les mêmes. Tout appel pour lequel l'argument de modèle 'Exception' et le type du premier argument de l'appel de fonction ne seront pas ambigus. –

+0

Vous avez raison, je vais modifier ma réponse. – ronag

+0

Comment 'Int2Type ' correspond 'Int2Type '? – ybungalobill

Questions connexes