Ошибка c2593 (идентификатор оператора неоднозначен) при компиляции для платформы x64

Я пытаюсь скомпилировать проект C++ с использованием Microsoft VisualStudio 2008. Этот конкретный проект прекрасно компилируется, если вы используете Win32 в качестве целевой платформы. Если я пытаюсь скомпилировать тот же проект для платформы x64, я получаю C2593 'идентификатор оператора', это неоднозначная ошибка в этой строке:

case 't':  os_ << (size_t)path->rnode->char_type;     break;

Кто-нибудь знает, почему одна и та же строка прекрасно компилируется для 32-битной, но не работает для 64-битной с такой высокой ошибкой уровня?

1 ответ

Решение

Хорошо понял. Проблема заключается в типе данных size_t, который имеет разные размеры для двух разных платформ. Оператор << определен для различного списка типов данных:

StringBuffer& operator<<(unsigned short int n) { _UITOA(n); }
StringBuffer& operator<<(unsigned int n)       { _UITOA(n); }

На 32-битной платформе "unsigned int" идеально подходит для size_t. На 64-битных платформах size_t является 64-битным и не совпадает точно ни с одним объявлением оператора.

Решение состоит в том, чтобы выбрать точного оператора, используя правильный тип данных:

case 't':  os_ << (unsigned int)path->rnode->char_type;     break;

Или перегрузите оператор с помощью size_t:

StringBuffer& operator<<(size_t)       { _UITOA(n); }
Другие вопросы по тегам