ошибка C2766 в <fstream>(Visual C ++ 10), множественные явные специализации _Ungetc - PullRequest
1 голос
/ 09 ноября 2011

Я портирую решение с Visual C ++ 8 (Visual Studio 2005) на 10 (Visual Studio 2010), и я получаю загадочную ошибку, для которой я нашел только редкие ссылки в Интернете (например, this, что относится к visual studio 2005, но никаких последующих действий не предпринимается, поэтому он должен быть каким-то образом исправлен).

Ошибка заключается в следующем.В файлах, содержащих заголовок fstream, я получаю

1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\fstream(111): error C2766: explicit specialization; 'bool std::_Ungetc<char>(const char &,_iobuf *)' has already been defined
1>          C:\Program Files\Microsoft Visual Studio 10.0\VC\include\fstream(103) : see previous definition of '_Ungetc'

Сначала я предположил, что осталась некоторая ссылка на VC 8, поэтому я начал с нуля добавлять существующие файлы в новое решение / проект, но получаюта же ошибка.Закомментируя include (и соответствующие функциональные возможности), проект компилируется и связывается.

Это должно быть какой-то неверной конфигурацией моих частей, так как минимальная программа, подобная этой,

#include <fstream>
int main(){
    std::fstream stream;
    return 0;
}

компилируетсябез ошибок, поэтому заголовок не был поврежден после установки.

Я, к сожалению, не могу воспроизвести минимальный рабочий пример, но я надеюсь, что что-то из этой проблемы может кому-то позвонить.У вас есть предложения, что я могу проверить?

1 Ответ

2 голосов
/ 09 ноября 2011

Код в строках, упомянутых в сообщении об ошибке, определяет несколько специализаций для _Ungetc() на основе const char&, const signed char& и const unsigned char& соответственно.

Ошибка, по-видимому, указывает на то, что вашакомпилятор обрабатывает signed char как тот же тип, что и char, что не должно произойти .

Я думаю, что где-то в вашем коде до включения <fstream>у вас есть:

#define char signed char

Или, что еще хуже:

#define signed

В этом случае удаление ошибочной строки решит вашу проблему.Обратите внимание, что char в любом случае подписано по умолчанию в MSVC, если вы не передадите ему параметр / J .

...