«Стек вызовов» для ошибок C ++ в Visual Studio 2005 - PullRequest
0 голосов
/ 10 июля 2009

Существует ли «стек вызовов» для ошибок компилятора в Visual Studio 2005 (C ++)?

Например, я использую boost :: scoped_ptr в качестве значения в QHash. Это, однако, вызывает следующую ошибку компиляции:

1>c:\qt\include\qtcore\../../src/corelib/tools/qhash.h(743) : error C2248: 'boost::scoped_ptr<T>::operator =' : cannot access private member declared in class 'boost::scoped_ptr<T>'

Из выходных данных сборки я знаю, какой из моих исходных файлов вызывает ошибку, и номер строки в qhash.h, который вызывает ошибку, но я пытаюсь отследить номер строки в my исходный файл, который генерирует ошибку (отсюда и идея «стека вызовов»).

Обратите внимание, я не ищу решение проблемы использования scoped_ptr в QHash, но проблема отслеживания, где генерируются ошибки компиляции. Это также будет полезно для отслеживания странных предупреждений. Чаще всего я сталкиваюсь с этой проблемой при использовании шаблонных классов.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 10 июля 2009

Иногда со странными ошибками помогает предварительно обработать файл и посмотреть на этот вывод. В VS найдите «Generate Preprocessed File» в настройках препроцессора (или установите переключатель / P). Это сгенерирует XXX.i из XXX.cpp, что может помочь вам разобраться в проблеме.

Убедитесь, что вы выключили переключатель после того, как эта опция включена, он не будет генерировать файл obj.

0 голосов
/ 10 июля 2009

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

В этом случае говорится, что у вас есть объект типа boost::scoped_ptr<T>, который он пытается скопировать, но класс не позволит вам (operator = и ctor копирования оба скрыты). Поэтому вам нужно посмотреть, как используется класс, и понять, почему он пытается его скопировать. Может быть, scoped_ptr не то, что вам нужно. Может быть, вам нужен shared_ptr?

0 голосов
/ 10 июля 2009

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

Здесь действительно нет понятия «стек вызовов», потому что компилятор обрабатывает один исходный файл за раз. В файле заголовка есть ошибка компилятора, поэтому вам нужно выяснить, какой исходный файл, включая этот заголовок, компилировался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...