0

以前にも似たような質問を投稿したことがありますが、コードに若干の誤りがあったため無視されました。もう一度質問させてください。

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

対エラー:

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

GCC:

$ 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
4

3 に答える 3

1

エラーはコンパイラ間で大きく異なる可能性があり、そのうちの1つが別のコンパイラよりも役立つ可能性が高いため、異なるコンパイラを使用してコンパイルすることをお勧めします。ほとんどの場合、 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;

こちらをご覧ください

于 2013-03-12T11:32:27.227 に答える
1

プライベート コピー コンストラクターを持つObjectHolderクラスのオブジェクトが含まれているため、コンパイラはコピー コンストラクターを生成 (合成) できません。NonCopyableObject

デフォルトでは、生成されたコピー コンストラクターは、すべてのメンバー オブジェクトと親オブジェクトのコピー コンストラクターを呼び出します。

于 2013-03-12T11:22:48.810 に答える
1

をコピーしようとしていますObjectHoder

ObjectHolder second(first);

ただし、コピーできないオブジェクトが含まれているため、コピーできません。コードがコンパイル時に禁止するように設計されていることを実行しようとしています。両方のコンパイラがこれを伝えています。

于 2013-03-12T11:22:26.683 に答える