namespace + friend
От: x-code  
Дата: 17.04.15 18:16
Оценка:
Такой код
namespace ns
{
    class C
    {
        friend void foo(C *pc);
        //friend void foo(ns::C *pc); // - без разницы
        int x;
    };
}

void foo(ns::C *pc)
{
    pc->x = 10;
}


выдает ошибку

'ns::C::x' : cannot access private member declared in class 'ns::C'


если убрать пространство имен, то ошибки нет. Но убирать нельзя. Как можно это побороть?
компилятор vs2013.
Отредактировано 17.04.2015 18:17 x-code . Предыдущая версия .
Re: namespace + friend
От: __kot2  
Дата: 17.04.15 18:23
Оценка:
Здравствуйте, x-code, Вы писали:
может friend void ::foo(C *pc); будет работать?
Re[2]: namespace + friend
От: x-code  
Дата: 17.04.15 18:34
Оценка:
Здравствуйте, __kot2, Вы писали:

__>может friend void ::foo(C *pc); будет работать?


нет, не работает, это первое что я стал пробовать.
Работает вот такая громоздкая конструкция
namespace ns
{
    class C;
}

void foo(ns::C *pc);

namespace ns
{
    class C
    {
        friend void ::foo(ns::C *pc);
        int x;
    };
}

void foo(ns::C *pc)
{
    pc->x = 10;
}

но то на тестовом примере, в реальном коде все несколько сложнее... буду пробовать.
Re: namespace + friend
От: Abyx Россия  
Дата: 17.04.15 18:50
Оценка:
Здравствуйте, x-code, Вы писали:

"friend что-то там" не является forward-declaration,
по этому надо сначала написать самого друга или его forward-declaration, а потом написать класс с friend statement.
In Zen We Trust
Re: namespace + friend
От: Кодт Россия  
Дата: 18.04.15 14:00
Оценка:
Здравствуйте, x-code, Вы писали:

XC>если убрать пространство имен, то ошибки нет. Но убирать нельзя. Как можно это побороть?

XC>компилятор vs2013.

Сделать объявление функции до объявления класса
namespace ns { class C; };
void foo(ns::C*);

namespace ns {
  .....
  class C {
    friend void ::foo(C*);
    .....
  }
  .....
}
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.