2010-08-04 6 views
0

Jetez un oeil à la pièce de code suivanteConstructor avec des arguments de référence dans le compilateur g ++

tête du fichier:

class CxUser 
{ 
public: 
    CxUser(string& guid) {} 
}; 

J'ai C++ fichier qui instancie la classe en utilisant CxUser(string("xxx-xxx-x-xxxx")). Mais cette déclaration ne peut pas compiler en g ++ avec l'erreur « pas de fonction concordante pour appel à CxUser :: CxUser (std :: string) » alors qu'il compile dans VC++. Étonnamment, le morceau de code suivant pour instancier la classe fonctionne.

string guid("xxx-x-xxxx-xxx-xx"); CxUser user(guid); 

Toute aide serait appréciée ....

+0

Pourriez-vous poster le message d'erreur? – doron

+0

édité avec un message d'erreur – Prabhu

Répondre

12

Vous avez besoin:

class CxUser{ public: CxUser(const string& guid) {} } 

Quand vous dites:

CxUser c("foobar"); // or whatever 

un objet chaîne temporaire est créée à partir du characterv tableau. En C++, vous ne pouvez pas lier des références non-const à des temporaires.

2

Vous demandez à transmettre une référence à une chaîne - essentiellement un pointeur vers l'emplacement où elle est stockée. Mais quand vous créez le temporaire anonyme comme ça, il n'est pas stocké n'importe où --- "il n'y a pas là-bas" - il n'y a rien à passer. En le stockant dans un temporaire nommé, vous lui donnez un emplacement pour travailler avec.

Lorsque vous utilisez une référence non-const comme paramètre, vous le laissez entendre que vous allez changer la référence, qui est inexistante, donc vous ne pouvez pas le changer. Lorsque vous utilisez une référence const, le compilateur sait que vous ne pouvez pas le modifier, donc il peut faire un peu de magie pour que le paramètre de référence temporaire anonyme fonctionne.

+0

Si tel était le cas, on ne pouvait pas appeler les membres non-const sur une base temporaire (qui reçoivent un pointeur non-const 'this'), mais vous pouvez. –

+0

@Ben: pas légalement, non. –

+0

@Konrad: Êtes-vous en train de dire que vous ne pouvez pas appeler légalement des membres non-const sur une base temporaire? –

1

Je pense que si vous faites le constructeur accepte un const std::string& alors le CxUser(string("xxx-xxx-x-xxxx")) devrait fonctionner.

+1

vous dire 'const std :: string &' (bien sûr, il fonctionne sans la référence) – UncleZeiv

+0

Eh bien oui. Chaque fois que vous transmettez une valeur non-POD, vous devez la transmettre par référence ou pointeur. –

Questions connexes