У меня есть класс, наследующий от 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)) {}
...
Затем в другом проекте моего решения у меня есть класс C, унаследованный от B, скажем, с выдержкой из заголовка:
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 set_A
, Цените, если у кого-нибудь есть идеи по этому поводу и можете пролить свет? Спасибо как всегда за ваш интерес.
Подводя итог, я не понимаю, почему компилятор требователен к тому, когда применять ошибку в отношении boost::noncopyable
, Когда я закомментирую set_A(..)
функция в классе C, все компилируется нормально. Но когда я сохраняю его, он выдает ошибку, в то время как у него нет проблем с этим в классе B. Я также немного отредактировал сообщение об ошибке выше, чтобы дать больше деталей. Здесь я отмечаю, что там говорится о функции, сгенерированной компилятором. Может быть, по какой-то причине это произошло только с классом С? Зачем?
Прежде всего, теперь я лучше понимаю ваш вопрос, но я все еще не понимаю, почему вы не хотите изменить свою реализацию на:
struct C::impl {
impl(A& a) : m_a(&a) {}
void set_A(A& a) {m_a = &a;}
A* m_a;
};
С A
не копируемый это просто не работает:
void set_A(A& a) {m_a = a;}
Тем не мение:
Эта ошибка:
ошибка C2248: ‘boost :: scoped_ptr :: operator =’: невозможно получить доступ
закрытый член объявлен в классе ‘boost :: scoped_ptr’ с T =
A :: осущ
это потому что boost::scoped_ptr<T>
не подлежит копированию, и этот факт не связан с тем, что ваш A
класс не копируется.
Эта ошибка:
Эта диагностика произошла в сгенерированной компилятором функции ‘A&
A :: operator = (const A&)»
наверняка из-за одного из XXX::set_A(A& a) { m_A = a; }
функции. В такой функции A::operator =(const A&)
требуется — и, поскольку он не определен, компилятор попытается определить по умолчанию. По умолчанию один будет копировать участников по одному — и один из A
участники не копируются boost::scoped_ptr<A::impl>
,
Тогда самый важный для вас вопрос — почему только одна ошибка — не для обоих XXX::set_A(A& a) { m_A = a; }
методы?
Я протестировал упрощенную версию вашего случая в моей среде g ++ 4.5.x. Диагноз очень похож на ваш — и эффект очень похож — только один set_A
функция жаловалась — первая. Это потому что A& operator = (const A&)
необходим для обоих — но генерировать только для первого. G ++ дает отличный диагноз:
../src/AnExample.cpp:24:32: note: synthesized method 'A& A::operator=(const A&)' first required here
Мой пример и диагноз:
class noncopyable {
private:
noncopyable(const noncopyable&);
noncopyable& operator = (const noncopyable&);
};
class A {
noncopyable m;
};
class B {
B(A& a) : a(a) {}
void set_A(A& a) { this->a = a; } // line 24
A& a;
};
class C {
C(A& a) : a(a) {}
void set_A(A& a) { this->a = a; }
A& a;
};
make all
Building file: ../src/AnExample.cpp
Invoking: Cygwin C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/AnExample.d" -MT"src/AnExample.d" -o "src/AnExample.o" "../src/AnExample.cpp"../src/AnExample.cpp: In member function 'A& A::operator=(const A&)':
../src/AnExample.cpp:15:17: error: 'noncopyable& noncopyable::operator=(const noncopyable&)' is private
../src/AnExample.cpp:18:9: error: within this context
../src/AnExample.cpp: In member function 'void B::set_A(A&)':
../src/AnExample.cpp:24:32: note: synthesized method 'A& A::operator=(const A&)' first required here
make: *** [src/AnExample.o] Error 1
src/subdir.mk:18: recipe for target `src/AnExample.o' failed
Других решений пока нет …