Внутренняя ошибка компилятора VS2008

Я постоянно сталкиваюсь с внутренней ошибкой компилятора при попытке переключиться с MSVC6 на MSVC 2008. После большой работы, комментирующей различные части программы, я проследил ошибку до двух строк кода в двух разных файлах CPP. Оба этих файла CPP успешно компилируются, но каким-то образом влияют на то, проявляется ли ошибка в других файлах.

Обе эти строки включают создание нескольких сложных вложенных шаблонов. Они также являются единственными местами в приложении, которые используют абстрактный класс в качестве одного из параметров шаблона. Тем не менее, я не уверен, что проблема связана с абстрактными классами или шаблонами, это просто самая очевидная вещь, которую я заметил. Я даже не могу быть уверен, что эти строки значимы вообще. Вот как они выглядят:

m_phDSAttributes = new SObjDict<RWCString, SIDataSource>(&RWCString::hash);

Итак, у нас есть SObjDict, класс шаблонного словаря, SIDataSource, абстрактный интерфейс, а параметр является указателем на статическую функцию-член RWCString.

Я немного поигрался с кодом, и иногда могу получить ошибку при переходе от одного файла CPP к другому (например, я изменил кучу объявлений шаблонов с помощью class в typename), но я не могу найти рифму или причину для этого.

Я в недоумении относительно того, как отладить эту проблему дальше. Точная ошибка вывода компилятором (с измененным именем моего исходного файла) приведена ниже. Там нет упоминания об этом нигде в Интернете. Я очень отчаянно нуждаюсь в любом совете о том, как поступить. Я не ожидаю, что кто-то скажет: "О, вам просто нужно сделать XYZ", но указатель на то, как отлаживать такого рода проблемы, был бы очень признателен.

1>d:\Dev\webapi.cpp : fatal error C1001: An internal error has occurred in the compiler.
1>(compiler file 'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c', line 5905)

5 ответов

Решение

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

Разумно предположить, что p2symtab.c является (частью) кодом таблицы символов. Это немедленно объяснило бы, как обновление вызвало это; этот код был переписан. (Помните о предупреждениях длиной в 255 символов в VC6?)

В этом случае нет новой записи в таблице символов, так что, скорее всего, поиск в таблице символов завершится неудачно. Было бы интересно посмотреть, повлияет ли на результат контекст, в котором происходит поиск по имени. Например, что произойдет, если вы измените код на

typedef SObjDict<RWCString, SIDataSource> SObjDict_RWCString_SIDataSource;
m_phDSAttributes = new SObjDict_RWCString_SIDataSource(&RWCString::hash);

Это заставит создать еще одну запись таблицы символов, для SObjDict_RWCString_SIDataSource, Эта запись является своего рода символической ссылкой на создание шаблона. Новое имя можно (и нужно) искать самостоятельно.

Начните разбивать его на более мелкие части. Мое первое предположение, что указатель на статическую функцию будет проблемой. Можете ли вы сделать фиктивный не шаблонный класс с тем же параметром в конструкторе? Компилируется ли он, если вы не используете абстрактный класс в шаблоне?

Похоже, я отправляю вас не в том направлении, в 2008 году нормально скомпилируется следующее:

class thing {
public:
    static void hash( short sht ) {
    }

    void hash( long lng ) {
    }
};

class thing2 {
public:
    thing2( void (short ) ){}
};

int _tmain(int argc, _TCHAR* argv[])
{
    thing2* t = new thing2( &thing::hash );
    delete t;
    return 0;
}

Принцип остается тем не менее, удаляйте / заменяйте сложные элементы, пока у вас не будет компилируемого кода, и вы не будете знать, что является причиной проблемы.

Фатальная ошибка C1001: в компиляторе произошла внутренняя ошибка. 1>(файл компилятора 'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c

я также наблюдал ту же ошибку, когда пытался собрать код с версии 2005 для версии 2008. но это происходило до тех пор, пока я не установил пакет обновления VS 2008...

Вы установили пакет обновления... Я думаю, что это решило вашу проблему....

Это обычно происходит с созданием шаблона. К сожалению, это может быть вызвано многими причинами, но 99% времени ваш код тонко вызывает неопределенное поведение.

Другие вопросы по тегам