Ошибка C2593: оператор = является неоднозначным - PullRequest
1 голос
/ 16 июня 2009
typedef map<wstring , IWString> REVERSETAG_CACHE ;
REVERSETAG_CACHE::iterator   revrsetagcacheiter;
.
.
.
wstring strCurTag;
strCurTag =  revrsetagcacheiter->second; //Error C2593

Ошибка C2593: оператор = неоднозначен

Почему приведенное выше назначение дает эту ошибку? Работает в VC6. Не компилируется в VC9.

Ответы [ 4 ]

3 голосов
/ 16 июня 2009

По-видимому, VC6 допускает применение нескольких пользовательских преобразований, в то время как (правильно) VC9 этого не делает. Посмотрите на C ++ неявные преобразования для обсуждения общей проблемы.

Общее решение состоит в том, чтобы предоставить необходимое преобразование самостоятельно, вместо того, чтобы компилятор пытался это сделать.

2 голосов
/ 16 июня 2009

revrsetagcacheiter->second относится к типу IWString. Следовательно, это не скомпилируется. Я не думаю, что он будет компилироваться и в VC6.

Я попробую в последний раз : Является ли ваш метод класса BasicString c_str ()? Если это так, попробуйте преобразовать его в wstring, используя std::wstring str(iter->second.c_str());

0 голосов
/ 16 июня 2009

Обычно следует избегать неявных преобразований, т. Е. Заставить все ваши назначения работать с одним и тем же типом с одной и другой стороны, особенно когда очень просто знать, какие типы задействованы. Полагаться или пытаться полагаться на неявные преобразования не очень хорошая идея.

Так что если:

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

не компилируется, тогда мы должны начать думать о проблеме.

0 голосов
/ 16 июня 2009

Попробуйте привести то, что вы присваиваете к правильному типу.

Например:

strCurTag =  (wstring)revrsetagcacheiter->second;

Еще лучше, вы могли иметь в виду:

IWstring strCurTag;
...