【问题标题】:Compilation warning for Objects that contain non Copyable objects are unreadable包含非 Copyable 对象的对象的编译警告不可读
【发布时间】:2013-03-07 15:41:14
【问题描述】:

我之前问过一个类似的问题,但现在我想更具体一点。 我面临的问题是我有一个包含不可复制对象的对象,当有人想使用我的接口并且他没有很好地使用它(确实尝试使用对象的复制构造函数)时,他会得到一个编译错误,它将指向对象而不是他的实际代码。 所以两个问题: 1.我可以以某种方式修复它以将其指向他的原始代码行吗? 2.如果我不能,我怎么能放一个只有在有人真正尝试使用副本c'tor时才会发生的static_assert(我已经尝试了一些但即使有人不使用它我也会得到它们...... )

我正在添加示例代码和编译错误,以防我不理解...... 注意最后的编译错误指向 ObjectHolder h。文件..虽然我希望它指向主要 谢谢!

* 是我替换名称时的错误。实际上是代码造成了编译错误。 让我们假设我不想实现一个私人复制 c'tor 只是为了转发残疾复制

class NonCopyableObject 
{
    public:
        virtual ~NonCopyableObject () {}

        NonCopyableObject(int i) { m_index = i;}
        int m_index;
    private:
        NonCopyableObject(const NonCopyableObject& other) {}
};

class ObjectHolder 
{
    public:
        virtual ~ObjectHolder ();
        ObjectHolder(int i) : obj(i) {}

        NonCopyableObject obj;
};

void main()
{
    ObjectHolder first(1);
    ObjectHolder second(first);
}

1>------ Build started: Project: tester, Configuration: Debug Win32 ------
1>  main.cpp
1>d:\users\someone\documents\visual studio 2012\projects\tester\tester\objectholder.h(13): error C2248: 'NonCopyableObject::NonCopyableObject' : cannot access private member declared in class 'NonCopyableObject'
1>          d:\users\someone\documents\visual studio 2012\projects\tester\tester\noncopyableobject.h(15) : see declaration of 'NonCopyableObject::NonCopyableObject'
1>          d:\users\someone\documents\visual studio 2012\projects\tester\tester\noncopyableobject.h(8) : see declaration of 'NonCopyableObject'
1>          This diagnostic occurred in the compiler generated function 'ObjectHolder::ObjectHolder(const ObjectHolder &)'

【问题讨论】:

  • 也尝试在ObjectHolder中隐藏复制构造函数
  • 我确定这不是导致此处发布的编译错误的实际代码。
  • 如果您不希望您的对象具有可访问的复制构造函数,请将其设为 private(或者,在 C++11 中,delete 它)。
  • 你为什么想要那个?所有主要编译器的编译器诊断都告诉您您正在尝试使用私有构造函数。只需在 API 文档中记录您的类不可复制的事实。如果您的某个用户随后尝试复制它,遇到此错误并且无法弄清楚发生了什么,那么他们对 C++ 的了解不够,您无法修复它
  • 我已经对其进行了编辑,所以它是相同的代码。对于复制替换错误,他们确实是 C++ 的新手,但如果他们想知道他们是错误的,他们会有评论他们是整个代码只是为了找出...

标签: c++ compilation copy-constructor static-assert


【解决方案1】:

提供的错误消息不反映提供的代码。

除此之外,您还有一个错误。考虑代码:

class ObjectHolder 
{
    public:
        virtual ~ObjectHolder ();
        ObjectHolder(int i) : obj(i) {}

        ObjectHolder obj;
};

ObjectHolder 递归时,编译器如何确定它所需的内存量?

【讨论】:

  • 复制的时候出错了!!..其实是class ObjectHolder { public: virtual ~ObjectHolder (); ObjectHolder(int i) : obj(i) {} NonCopyableObject obj; };
猜你喜欢
  • 1970-01-01
  • 2020-09-07
  • 2014-10-19
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 2014-09-19
相关资源
最近更新 更多