8

我想知道是否有办法获得有关 msvc (2005) 中错误位置的更好信息?

例如,在我的类中从 boost::noncopyable 继承时,我收到一个 C2248 错误,如下所示:

错误 C2248:“boost::noncopyable_::noncopyable::noncopyable”:无法访问在类“boost::noncopyable_::noncopyable”中声明的私有成员。此诊断发生在编译器生成的函数“MyClass::MyClass(const MyClass &)”中

但它无法告诉我复制构造函数的确切调用位置。这有点烦人。我真的不确定,但我想我记得在某个地方看到了一个设置,我可以在其中指定输出级别或其他东西,但我搜索并没有找到任何东西,所以我的问题是:有没有办法让 msvc 中的错误消息变得更好(更完整?) ?

编辑:好吧,既然 stackoverflow 刚刚告诉我我应该接受一个答案,我想知道是否有人可以判断 msvc 2008/2010 是否可以更好地诊断此错误?有人还提到GCC应该这样做,有人可以证实这一点吗?其他编译器(英特尔?Comeau?)呢?

谢谢

4

5 回答 5

4

我可以用 Code::Blocks 和 VC++ 2005 确认,它没有提示错误发生的位置。声明自己的私有复制构造函数也没有帮助。

#include <boost/noncopyable.hpp>

class X: boost::noncopyable
{
};

void foo(X x) {}

int main()
{

    X x;
    foo(x);
}

编译日志(第五行是类声明的最后一行):

main.cpp(5) : error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable' C:\boost_1_38_0\boost/noncopyable.hpp(27) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable' C:\boost_1_38_0\boost/noncopyable.hpp(22) : see declaration of 'boost::noncopyable_::noncopyable' This diagnostic occurred in the compiler generated function 'X::X(const X &)'

除非有一个编译器开关来启用更彻底的错误诊断,否则这不是我第一次简单地使用 GCC (MinGW) 编译文件以获得更有用的错误诊断。(唉,你的代码应该没有 VC++ 扩展。)

于 2009-10-15T20:13:18.610 回答
0

您可以临时创建一个手动复制构造函数(具有相同的签名)和默认实现,只是为了跟踪此错误..?不确定这是否会更容易找到。

于 2009-10-15T20:01:41.890 回答
0

实际上,解决此问题的最佳方法(此处为 VS2013)似乎迭代地爬过输出窗口:

1/ 当您在输出中收到消息“此诊断发生在编译器生成的函数 'X::X(const X &)'”中时,转到您的“X”类并使用 C++ 显式删除复制构造函数11 表示法:“X(const X&) = delete;”

2/重新编译,现在输出必须显示相同的错误,但在子类上发生诊断,然后再次循环到步骤1以明确删除子类上的复制构造函数,直到到达真正的错误类...

于 2016-05-18T11:59:28.653 回答
-1

在输出窗口或构建日志中,您应该看到编译器尝试在您的代码中使用模板的位置......不过,您必须滚动一下。

如果构建日志中没有足够的信息,还有一个控制 msbuild 详细程度的选项:
Tools->Options->Projects and Solutions->Build and Run->MSBuild project output verbosity

于 2009-10-15T19:54:26.773 回答
-1

打开输出窗口,其中显示完整的构建日志。检查那里的错误消息。在该错误消息下,您通常可以找到可以帮助您追踪问题根源的更多信息。

如果双击错误列表中的问题并转到输出窗口,光标将定位到该错误消息。

于 2009-10-15T20:02:25.743 回答