我想知道是否有办法在msvc(2005)中获得有关错误位置的更好信息?
例如,当我在类中继承boost :: noncopyable时,我收到一个C2248错误,上面写着:
错误C2248:'boost :: noncopyable _ :: noncopyable :: noncopyable':无法访问类'boost :: noncopyable _ :: noncopyable'中声明的私有成员。 此诊断发生在编译器生成的函数'MyClass :: MyClass(const MyClass&)'
但它没有告诉我复制构造函数的确切位置。这有点烦人。我真的不确定,但我想我记得在某个地方看到了我可以指定输出级别的东西,但是我搜索后发现什么都没有,所以我的问题是:有没有办法在msvc中变得更好(更丰满?)错误信息?
编辑:好吧,因为stackoverflow告诉我我应该接受一个答案,我想知道是否有人可以告诉msvc 2008/2010是否能更好地诊断这个错误?有人还提到GCC应该这样做,有人能证实这一点吗?那么其他编译器(英特尔?,Comeau?)
由于
答案 0 :(得分: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 ++扩展。)
答案 1 :(得分:0)
您可以临时创建一个手动复制构造函数(具有相同的签名)和默认实现,只是为了追踪此错误..?不确定是否会让它更容易找到。
答案 2 :(得分:0)
实际上,解决此问题的最佳方法(这里是VS2013)似乎迭代地爬过输出窗口:
1 /当您在输出中收到消息“此诊断发生在编译器生成的函数'X :: X(const X&amp;)'”中时,转到'X'类并显式删除复制构造函数C ++ 11表示法:“X(const X&amp;)= delete;”
2 /重新编译,现在输出必须显示相同的错误但是在子类上发生诊断,然后再循环到步骤1以明确删除子类的复制构造函数,直到到达真正的错误类...
答案 3 :(得分:-1)
在输出窗口或构建日志中,您应该看到编译器尝试在代码中使用模板的位置...您必须滚动一下。
如果构建日志中没有足够的信息,还有一个控制msbuild详细程度的选项:
工具 - &gt;选项 - &gt;项目和解决方案 - &gt;构建和运行 - &gt; MSBuild项目输出详细程度
答案 4 :(得分:-1)
打开输出窗口,显示完整的建筑日志。检查错误消息。在该错误消息下,您通常可以找到更多可以帮助您跟踪问题根源的信息。
如果双击错误列表中的问题并转到输出窗口,则光标将定位到该错误消息。