Вопрос

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

Решение

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

Другие советы

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

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

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

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

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

Похоже, что я отправляю вас не в том направлении, в 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% времени ваш код тонко вызывает неопределенное поведение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top