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 不同的编译错误,“在此上下文中”的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio C++ 位域结构体大小问题

C++ 指针使用 Visual Studio 更改地址,而不是使用 OsX 中的 Xcode 或 Linux 中的 gcc

如何使 Visual Studio C++ 2010 编译行为像 gcc/g++? (或相反亦然)

在Visual Studio或GCC中使用表情符号作为c ++中的标识符名称

Visual Studio 2010:扩展/差异

C++ 奇怪行为 Visual Studio