から継承するクラスがありboost::noncopyable
ます。たとえば、ヘッダーの抜粋を次のようにします。
class A : boost::noncopyable {
...
blah
...
private:
struct impl;
boost::scoped_ptr<impl> m_impl;
};
次に、私のソリューションのプロジェクトの1つboost::noncopyable
に、実装の詳細のプライベートメンバーがタイプAのオブジェクトへの参照であるクラス(たまたまから継承する)があります。たとえば、ヘッダーの抜粋で:
class B : boost::noncopyable {
...
blah
...
private:
struct impl;
boost::scoped_ptr<impl> m_impl;
};
および実装の抜粋 (cpp) では:
struct B::impl {
impl(A& a) : m_a(a) {}
set_A(A& a) {m_a = a;}
A& m_a;
...
}
B(A& a) : m_impl(new impl(a)) {}
...
次に、私のソリューションの別のプロジェクトでは、B から継承するクラス C を、ヘッダーの抜粋とともに使用します。
class C : public B {
...
blah;
...
private:
struct impl;
boost::scoped_ptr<impl> m_impl;
};
および実装の抜粋 (cpp) では:
struct C::impl {
impl(A& a) : m_a(a) {}
void set_A(A& a) {m_a = a;}
A& m_a;
};
C(A &a) : B(a), m_impl(new impl(a)) {}
...
しかし、MSVC++ 2008 でビルドしようとすると、次のエラーが発生します。
error C2248: 'boost::noncopyable_::noncopyable::operator =' : cannot access private member declared in class 'boost::noncopyable_::noncopyable'
see declaration of 'boost::noncopyable_::noncopyable::operator ='
error C2248: 'boost::scoped_ptr<T>::operator =' : cannot access private member declared in class 'boost::scoped_ptr<T>' with T = A::impl
This diagnostic occurred in the compiler generated function 'A& A::operator =(const A&)'
コンパイラは、set_A
B ではなく、C の機能にのみ問題がありset_A
ます。誰かがこれについて何か考えを持っていて、光を当てることができるかどうか感謝しますか? いつもご関心をお寄せいただきありがとうございます。
編集:
要約すると、ここで私が理解していないのは、なぜコンパイラがエラーに関するエラーをいつ適用するかについてうるさいのかということですboost::noncopyable
。set_A(..)
クラス Cの関数をコメント アウトすると、すべて正常にコンパイルされます。しかし、それを保持するとエラーが発生しますが、クラス B では同じ問題はありません。詳細を示すために、上記のエラー メッセージを少し編集しました。ここで、コンパイラが生成した関数について何かを述べていることに注意してください。なんらかの理由でこれがクラス C でのみ発生した可能性はありますか? なんで?