包含非可复制对象的对象的编译警告是不可读的

时间:2013-03-07 15:41:15

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

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

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

当我替换名称时,

* 是一个错误..它实际上是创建编译错误的代码。 我们假设我不想实施私人复制,只是为了转发残疾复制

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 &)'

1 个答案:

答案 0 :(得分:1)

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

除此之外你有一个错误。考虑代码:

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

        ObjectHolder obj;
};

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