Здравствуйте, Myrgy, Вы писали:
M>Здравствуйте, _hum_
M>incpomplete тип, так как CI пока еще не знает о том, что в CA будет какой-то метод. а с friend class CA прокатывает, так как вы делаете брендом весь класс, соответственно допускается incomplete тип.
вроде ж у же выяснили, что суть проблемы не в этом, а в том, что объявление френдом метода приравнивается к декларации (прототипированию) этого метода, а значит, предоставляет возможность его вызова еще до определения. а это не приводит к неоднозначности и противоречиям, только если до вызова (а значит, и до декларирования) уже будет определен класс, которому принадлежит данный метод. отсюда и требование — объявление френд-метода должно идти по тексту только после определения класса этого метода.
M>что бы решить проблему поменяйте местами классы и перенесите код методов в .cpp файлы
M>M>class CI;
M>class CA
M>{
M>public:
M> void test(CI* ci);
M>};
M>class CI
M>{
M> friend void CA::test(CI* ci);
M> private:
M> int data;
M>};
M>// in .cpp
M>void CA::test(CI* ci)
M>{
ci->>data = 5;
M>}
M>int main() {
M> // your code goes here
M> return 0;
M>}
M>
этот вариант плох тем, что требует вынесение объекта типа CI за пределы класса CA (обратите внимание,в первоначально варианте значение результата инкапсулировано в сам объект класса CA)