1

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 中的行号,但我试图在我的源文件中追踪生成错误的行号(因此“调用堆栈”的想法)。

请注意,我不是在寻找在 QHash 中使用 scoped_ptr 问题的解决方案,而是在寻找生成编译错误的位置的问题。这对于帮助追踪奇怪的警告也很有用。在使用模板类时,我经常会遇到这个问题。

谢谢!

4

3 回答 3

2

有时会出现奇怪的错误,它有助于预处理文件并查看该输出。使用 VS 在预处理器设置下查找“生成预处理文件”(或设置 /P 开关)。这将从 XXX.cpp 生成 XXX.i,这可能会帮助您找出问题所在。

确保关闭开关后,打开此选项不会生成 obj 文件。

于 2009-07-10T15:08:44.433 回答
0

如果您查看构建输出,您应该会看到发生此错误时正在编译哪个项目和哪个 .cpp 文件。

这里实际上没有“调用堆栈”的概念,因为编译器一次处理一个源文件。头文件中有编译器错误,因此您需要找出正在编译的包含该头文件的源文件。

于 2009-07-10T14:49:31.643 回答
0

这些类型的错误很难追踪。通常我最终会注释掉代码并找到有问题的行并从那里开始工作。这样做一段时间后,您将学会更好地阅读错误消息并了解导致编译器出错的原因。就目前而言,编译器错误消息非常可怕。

在这种情况下,它表示您有一个类型的对象boost::scoped_ptr<T>,它试图复制但该类不允许您(operator= 和复制 ctor 都被隐藏)。所以你需要看看这个类是如何使用的,看看它为什么试图复制它。也许 ascoped_ptr不是你需要的。也许你需要一个shared_ptr

于 2009-07-10T15:06:01.240 回答