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 生成错误的源文件(因此称为“调用堆栈”)。
请注意,我不是在寻找在QHash中使用scoped_ptr的问题的解决方案,而是在追踪生成编译错误的位置的问题。这对于帮助追踪奇怪的警告也很有用。在使用模板化类时,我经常遇到这个问题。
谢谢!
答案 0 :(得分:2)
有时候出现奇怪的错误会有助于预处理文件并查看输出。使用VS在预处理器设置下查找“生成预处理文件”(或设置/ P开关)。这将从XXX.cpp生成XXX.i,这可以帮助您找出问题。
确保在关闭开关后,打开此选项将不会生成obj文件。
答案 1 :(得分:0)
如果查看构建输出,您应该看到在发生此错误时正在编译哪个项目和.cpp文件。
这里确实没有“调用堆栈”的概念,因为编译器一次处理一个源文件。您在头文件中有编译器错误,因此您需要找出包含该头文件的源文件。
答案 2 :(得分:0)
这些类型的错误很难追查。通常我最终会注释掉代码并查找有问题的行并从那里开始工作。在做了一段时间之后,您将学习更好地阅读错误消息并了解是什么绊倒了编译器。因为编译器的错误消息非常可怕。
在这种情况下,它表示你有一个类型boost::scoped_ptr<T>
的对象,它正在尝试复制,但是类不会让你(operator =和copy ctor都被隐藏)。因此,您需要查看类的使用方式,并了解它为什么要复制它。也许scoped_ptr
不是你需要的。也许你需要一个shared_ptr
?