2010-11-30 15 views
7

S'il vous plaît jeter un oeil à ce code et l'exécuter:
Je reçois une erreur très étrange:
Erreur 1 Erreur C2663: « Allocataire :: allocate_help »: 2 ont pas surcharges conversion légale pour 'this' pointeurjuridique pointeur « this »

template<class FailureSignal> 
class Allocator 
{ 
private: 
    template<class Exception,class Argument> 
    void allocate_help(const Argument& arg,Int2Type<true>) 
    { 
    } 

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

public: 
    template<class T> 
    void Allocate(signed long int nObjects,T** ptr = 0)const 
    { 
    allocate_help<std::bad_alloc>(1,Int2Type<true>()); 
    } 

}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Allocator<int> all; 
    all.Allocate<int>(1); 
    return 0; 
} 

Je ne comprends absolument pas cette err msg. J'espère que quelqu'un peut m'aider avec ça. Je vous remercie.

+1

Vous pouvez compiler comme vous l'avez demandé. 'Int2Type' n'est pas déclaré/défini –

Répondre

12

J'ai remarqué Allocate est déclaré const mais allocate_help n'est pas - cela peut-il être lié au problème?

+1

Oui, merci. Ne pourraient-ils pas fournir un peu plus de messages informatifs? –

+2

@There: recherche et [vous trouverez] (http://msdn.microsoft.com/en-us/library/bhx1a546.aspx "Erreur de compilation C2663"). Il y a deux résolutions suggérées. * 1: supprime le ** const ** de la déclaration d'objet. 2. Ajoutez ** const ** à l'une des surcharges de fonction membre. * (Ceci est le premier succès sur Google lors de la recherche de C2663) – Default

+1

@There: Il est très instructif à sa manière :) Il dit qu'il ne peut pas convertir le 'this' pointeur (c'est-à-dire de const allocator *' à Allocator * 'dans ce cas) pour l'une des surcharges' allocate_help'. –

0

J'ai eu la même erreur qui a également été causée par const mais d'une manière un peu différente.

J'ai deux fonctions virtuelles (surcharges), l'une était const et l'autre ne l'était pas. Cela causait le problème. Il s'avère que si vous voulez surcharger une fonction, ils doivent tous deux correspondre s'ils sont const ou non.

virtual void value() const = 0; 
virtual void value(MyStruct & struct) = 0; 

Le code ci-dessus provoquera cette erreur. Le correctif consiste à modifier la déclaration de 2ème à:

virtual void value(MyStruct & struct) const = 0;