Внутренняя ошибка компилятора VS2008 - PullRequest
2 голосов
/ 17 июня 2009

Я постоянно сталкиваюсь с внутренней ошибкой компилятора при попытке перейти с 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 ]

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

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

1 голос
/ 18 июня 2009

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

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

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

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

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

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

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

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

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

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

Похоже, что я отправляю вас в неправильном направлении, в 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;
}

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

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

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

...