代码之家  ›  专栏  ›  技术社区  ›  n1ckp

在使用MSVC时,有没有一种方法可以为错误的上下文获得更好的信息?(EX:C2248)

  •  8
  • n1ckp  · 技术社区  · 17 年前

    我想知道是否有一种方法可以获得有关MSVC(2005)中错误位置的更好信息?

    例如,在我的类中继承boost::noncopyable时,我得到一个C2248错误,它说:

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

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

    编辑:既然StackOverflow刚刚告诉我应该接受一个答案,我想知道是否有人能告诉我MSVC 2008/2010是否能更好地诊断这个错误?还有人提到GCC应该做的,有人能确认吗?其他编译器(英特尔)呢?科莫?

    谢谢

    5 回复  |  直到 9 年前
        1
  •  4
  •   UncleBens    17 年前

    我可以用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++扩展。)

        2
  •  0
  •   sean riley    17 年前

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

        3
  •  0
  •   A. Sintès    10 年前

    实际上,解决这个问题的最佳方法(这里是vs2013)似乎是迭代地在输出窗口中爬行:

    1 /当您收到“诊断在编译器生成函数x::x(const x&)”中出现在输出中时,转到您的“X”类,并使用C++ 11符号显式删除复制构造函数:“x(const x&)=删除”;

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

        4
  •  -1
  •   Cătălin Pitiș    17 年前

    打开输出窗口,显示完整的建筑日志。检查错误信息。在这个错误消息下,您通常可以找到更多的信息来帮助您跟踪问题的根源。

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

        5
  •  -1
  •   Georg Fritzsche    17 年前

    在输出窗口或生成日志中,您应该看到编译器试图在代码中使用模板的位置…不过,你得滚动一下。

    如果生成日志中没有足够的信息,则还有一个控制msbuild详细性的选项:
    工具->选项->项目和解决方案->生成并运行->msbuild项目输出详细信息