我有一个继承自的类boost::noncopyable
;说,标题摘录如下:
class A : boost::noncopyable {
...
blah
...
private:
struct impl;
boost::scoped_ptr<impl> m_impl;
};
然后在我的解决方案的一个项目中,我有一个类(也恰好继承自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&)'
编译器只对 C 的set_A
函数有问题,对 B 没有问题set_A
。欣赏是否有人对此有任何想法并可以阐明?一如既往地感谢您的关注。
编辑:
总而言之,我在这里不明白的是为什么编译器对何时应用有关boost::noncopyable
. 当我注释掉set_A(..)
C 类中的函数时,一切编译正常。但是当我保留它时,它会给出错误,而在 B 类中它没有任何问题。我还稍微编辑了上面的错误消息以提供更多细节。我在这里注意到它说明了一些关于编译器生成函数的内容。会不会因为某种原因只发生在 C 类?为什么?