C++ 与 gcc 和 Visual Studio 不同的编译错误,“在此上下文中”
Posted
技术标签:
【中文标题】C++ 与 gcc 和 Visual Studio 不同的编译错误,“在此上下文中”【英文标题】:C++ Different compilation error with gcc and visual studio, 'within this context' 【发布时间】:2013-03-12 11:20:37 【问题描述】:我之前也发过一个类似的问题,但是我的代码有一点小错误,所以被忽略了,让我再问一次。
在 Gcc 中,我得到了编译错误的确切行 在 VS2010/2012 中我不知道编译错误在哪里,有人可以帮忙吗? ** 在 VS 中,我怎么知道是哪一行调用了它?
我有以下代码:
#include "ObjectHolder.h"
int main()
ObjectHolder first(1);
ObjectHolder second(first);
return 0;
#ifndef NonCopyableObject_Included
#define NonCopyableObject_Included
class NonCopyableObject
public:
virtual ~NonCopyableObject ()
NonCopyableObject(int i) m_index = i;
int m_index;
private:
NonCopyableObject(const NonCopyableObject& other)
;
#endif
#ifndef ObjectHolder_Included
#define ObjectHolder_Included
#include "NonCopyableObject.h"
class ObjectHolder
public:
virtual ~ObjectHolder ();
ObjectHolder(int i) : obj(i)
NonCopyableObject obj;
;
#endif
VS 错误:
1>d:\users\user\documents\visual studio 2012\projects\tester\tester\objectholder.h(13):
error C2248: 'NonCopyableObject::NonCopyableObject' : cannot access private member declared in class 'NonCopyableObject'
d:\users\user\documents\visual studio 2012\projects\tester\tester
\noncopyableobject.h(13) : see declaration of 'NonCopyableObject::NonCopyableObject'
d:\users\user\documents\visual studio 2012\projects\tester\tester
\noncopyableobject.h(6) : see declaration of 'NonCopyableObject'
This diagnostic occurred in the compiler generated function
'ObjectHolder::ObjectHolder(const ObjectHolder &)'
海合会:
$ g++ -Wall -Werror --std=c++0x main.cpp -o test_no_copy
In file included from main.cpp:2:0:
NonCopyableObject.h: In copy constructor `ObjectHolder::ObjectHolder(const ObjectHolder&)':
NonCopyableObject.h:13:3: error: `NonCopyableObject::NonCopyableObject(const NonCopyableObject&)' is private
ObjectHolder.h:7:1: error: within this context
main.cpp: In function `int main()':
main.cpp:8:27: note: synthesized method `ObjectHolder::ObjectHolder(const ObjectHolder&)' first required here
【问题讨论】:
【参考方案1】:编译器无法在ObjectHolder
中生成(合成)复制构造函数,因为它包含类NonCopyableObject
的对象,该对象具有私有复制构造函数。
默认情况下,生成的复制构造函数调用所有成员对象和父对象的复制构造函数。
【讨论】:
这不是问题,问题是为什么 Visual Studio 不应对并向我显示调用它的实际行 @Alon:因为实际的行在生成的代码中,而不是人类可读的。【参考方案2】:使用不同的编译器进行编译是个好主意,因为它们之间的错误可能会有很大差异,而且其中一个可能比另一个更有帮助。在大多数情况下,我发现Clang 的错误报告是最好的。在您的示例中:
source.cpp:9:48: error: unused parameter 'other' [-Werror,-Wunused-parameter] NonCopyableObject(const NonCopyableObject& other) ^ source.cpp:25:18: error: call to implicitly-deleted copy constructor of 'ObjectHolder' ObjectHolder second(first); ^ ~~~~~ source.cpp:18:23: note: copy constructor of 'ObjectHolder' is implicitly deleted because field 'obj' has an inaccessible copy constructor NonCopyableObject obj;
See it here.
【讨论】:
问题不是为什么存在编译错误,而是为什么visual studio没有向我显示实际生成它的行 不幸的是,除了编译器的实现团队之外,没有人可以回答您为什么会收到(或没有收到)特定消息。我建议您继续做自己的事情并使用多个编译器进行编译。我已经通过这种方式从遗留代码中消除了几个错误。【参考方案3】:您正在尝试复制ObjectHoder
ObjectHolder second(first);
但是它包含一个不可复制的对象,所以它不能被复制。您正在尝试执行您的代码在编译时不允许执行的操作。两个编译器都在告诉你这一点。
【讨论】:
以上是关于C++ 与 gcc 和 Visual Studio 不同的编译错误,“在此上下文中”的主要内容,如果未能解决你的问题,请参考以下文章
C++ 指针使用 Visual Studio 更改地址,而不是使用 OsX 中的 Xcode 或 Linux 中的 gcc
如何使 Visual Studio C++ 2010 编译行为像 gcc/g++? (或相反亦然)