2009-06-16 16 views
1
typedef map<wstring , IWString> REVERSETAG_CACHE ; 
REVERSETAG_CACHE::iterator revrsetagcacheiter; 
. 
. 
. 
wstring strCurTag; 
strCurTag = revrsetagcacheiter->second; //Error C2593 

Erreur C2593: opérateur = est ambiguErreur C2593: opérateur = est ambigu

Pourquoi l'attribution ci-dessus donne cette erreur? Cela fonctionne dans VC6. Ne compile pas dans VC9.

+0

Veuillez donner le message d'erreur entier. Il devrait au moins indiquer les candidats possibles à l'appel. Ou est-ce que cela dit simplement "c'est ambigu"? –

+2

C'est exactement ce que dit l'erreur. Erreur C2593: L'opérateur '=' est ambigu. – bobbyalex

Répondre

2

revrsetagcacheiter->second est de type IWString. Par conséquent, il ne compilera pas. Je ne pense pas qu'il compilera également dans VC6.

Je vais essayer une dernière fois: Est-ce votre méthode BasicString c_str()? Si oui, essayez de le convertir en wstring en utilisant std::wstring str(iter->second.c_str());

+0

Il compile dans VC6 tout droit. – bobbyalex

+0

Pouvez-vous fournir la définition de IWString. Je suppose que VC6 effectue plusieurs conversions implicites pour créer un effet d'IWString comme le suggère Neil. – Naveen

+0

typedef BasicString > \t \t \t IWString; – bobbyalex

3

En cas de supposition, VC6 permet d'appliquer plus d'une conversion définie par l'utilisateur, alors que VC9 ne le fait pas (correctement). Jetez un oeil à C++ implicit conversions pour la discussion du problème général.

La solution générale est de fournir vous-même la conversion nécessaire, plutôt que de demander au compilateur de le faire.

0

Essayez de lancer ce que vous avez assigné au bon type.

Tels que:

strCurTag = (wstring)revrsetagcacheiter->second; 

Mieux encore, vous pouvez être dire:

IWstring strCurTag; 
0

Vous devez généralement éviter les conversions implicites, c'est-à-dire que toutes vos affectations fonctionnent exactement du même type d'un côté et de l'autre, surtout lorsqu'il est trivial de savoir quels types sont impliqués. Compter ou tenter de s'appuyer sur des conversions implicites n'est pas une bonne idée.

Donc, si:

strCurTag = static_cast<wstring>(revrsetagcacheiter->second); 

ne compile pas, alors nous devrions commencer à penser à ce problème.

+0

Ne fonctionne pas. Il dit erreur C2243: 'type cast': conversion de 'std_ex :: IWString *' à 'const std :: allocateur <_Ty> &' existe, mais est inaccessible. – bobbyalex

+0

J'abandonne. Je pense que je vais juste changer strCurTag à IWString. Pouvez-vous me dire comment convertir IWstring en wstring? Les membres suivants de IWstring c_str, bstr .... etc – bobbyalex

+0

Je suis désolé, je ne suis pas familier avec ces types. Y a-t-il un changement d'utilisation de types alternatifs? En fin de compte, tous les types string-ish devraient être en mesure de vous donner une séquence de leurs caractères, non? –