2009-06-17 2 views
2

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

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

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) 
+2

Вы еще жаловались Microsoft? Ошибка в компиляторе, даже если что-то не так с вашим кодом, так что вы в пределах своих прав для этого. И вообще, их команда-компилятор, вероятно, будет иметь наилучшее представление о том, в чем проблема. –

+0

@David: мы еще не отправили сообщение об ошибке в MS. Посмотрев на другие отчеты об ошибках, похожие на наши (в этом файле p2symtab.c, по-видимому, много ошибок), они отказываются от отчета об ошибке, который не содержит сценарий воспроизведения. Мои попытки сократить нашу ошибку до простого сценария воспроизведения потерпели неудачу. – rmeador

ответ

2

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

-1

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

0

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

Похоже, я посылаю тебя в неправильном направлении, следующий отлично компилируется в 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

, что указатель функции - это проблема, о которой я не думал. Я только заметил, что в RWCString есть 2 функции, называемые hash(). Один является статическим, другой - функцией-членом. У них разные подписи, хотя ... есть ли способ для меня вручную устранить их, чтобы я мог быть уверен, что это не отключает компилятор? – rmeador

+0

Если у вас есть контроль над RWCString, тогда измените имя, очевидно, если не создадите фиктивный класс с двумя аналогичными функциями, чтобы проверить, не является ли это вашей проблемой. Я надеюсь, что есть что-то, что вы можете сделать с указателями функций для устранения неоднозначности (у указателя функции есть подпись в конце концов), если не обернуть класс RWCString и иметь одну статическую функцию-член, называемую hash2, которая вызывает исходную статическую функцию ... не очень элегантно но будет изящно делать трюк. – Patrick

1

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

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

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

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

+0

Я попытался реализовать ваше предложение и не изменил результаты. Это очень плохо, так как ваша идея кажется звуковой и правдоподобной. – rmeador

0

Неустранимая ошибка C1001: Внутренняя ошибка произошла в компиляторе. 1> (составитель файл «F: \ дд \ vctools \ компилятор \ UTC \ SRC \ p2 \ p2symtab.c

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

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

+0

Я установил пакет обновления 1, который является самым новым, насколько я знаю. – rmeador