Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2018, 18:43   #1
NDrago
Пользователь
 
Регистрация: 22.09.2017
Сообщений: 45
По умолчанию Дружественные функции в пространстве имен

Доброе время суток всем,проблема такова,есть пространство имен в нем класс,в классе дружественная функция переопредения вывода в поток и приватные поля, определение класса и реализация находятся в разных файлах .hpp и .cpp соответственно,в файле реализации класса подключено пространство имен using namespace tree; и вот возникла проблема все функции класса работают и только дружественная ругается из-за попытки получить доступ к приватным полям класса,как только убираю пространство имен из .hpp файла все сразу работает,что за магия?
NDrago вне форума Ответить с цитированием
Старый 01.05.2018, 20:45   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Хрустальный шар показывает плохо, не вижу код..
Black Fregat вне форума Ответить с цитированием
Старый 01.05.2018, 20:54   #3
NDrago
Пользователь
 
Регистрация: 22.09.2017
Сообщений: 45
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Хрустальный шар показывает плохо, не вижу код..
Код:
namespace BSTree{
   struct Node{
      int data;
      Node* left;
      Node* right;
      Node*parent;
   };
   class Tree{
      private:
         Node *root;
      public:
         auto friend operator<<(std::ostream& os,const Tree& tree) -> std::ostream&;
   };
}

Код:
#include <iostream>
#include <fstream>
#include "bstree.hpp"
using namespace BSTree;

auto operator<<(std::ostream& os,const Tree& tree) -> std::ostream&{
   os<<tree.root->data<<endl;
   return os;
}
bstree.hpp: In function ‘std:: ostream& operator<<(std:: ostream&, const BSTree::Tree&)’:
bstree.hpp:13:10: error: ‘BSTree::Node* BSTree::Tree::root’ is private
Node* root;
^
BSTree.cpp:222:9: error: within this context
os<<tree.root->data<<endl;

Последний раз редактировалось NDrago; 01.05.2018 в 21:21.
NDrago вне форума Ответить с цитированием
Старый 02.05.2018, 00:14   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
auto operator<<(std::ostream& os,const Tree& tree) -> std::ostream&;
и
Код:
auto BSTree::operator<<(std::ostream& os,const Tree& tree) -> std::ostream&;
немного разные операторы и видимость у них разная.
p51x вне форума Ответить с цитированием
Старый 02.05.2018, 04:48   #5
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Насколько я помню, using namespace влияет только на видимость используемых идентификаторов, но никак не вводит нас автоматом внутрь namespace.

Если вариант с BSTree :: operator<< по каким-либо причинам не устраивает, можно войти в требуемый namespace явно:
Код:
namespace BSTree
{
  auto operator<<(std::ostream& os,const Tree& tree) -> std::ostream&{
     os<<tree.root->data<<endl;
     return os;
  }
}
Black Fregat вне форума Ответить с цитированием
Старый 02.05.2018, 11:29   #6
NDrago
Пользователь
 
Регистрация: 22.09.2017
Сообщений: 45
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Насколько я помню, using namespace влияет только на видимость используемых идентификаторов, но никак не вводит нас автоматом внутрь namespace.

Если вариант с BSTree :: operator<< по каким-либо причинам не устраивает, можно войти в требуемый namespace явно:
Код:
namespace BSTree
{
  auto operator<<(std::ostream& os,const Tree& tree) -> std::ostream&{
     os<<tree.root->data<<endl;
     return os;
  }
}
первый вариант не сработал
Код:
BSTree.cpp:221:73: error: ‘std::ostream& BSTree::operator<<(std::ostream&, const BSTree::Tree&)’ should have been declared inside ‘BSTree’
 auto BSTree::operator<<(std::ostream& os,const Tree& tr) -> std::ostream&{
второй сработал,в чем разница? ОО,вот сейчас сижу в полнейшем замешательстве
NDrago вне форума Ответить с цитированием
Старый 02.05.2018, 11:57   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от NDrago Посмотреть сообщение
первый вариант не сработал
Сработает, если правильно запишите. В хедере
Код:
   class Tree;
   auto friend operator<<(std::ostream& os,const Tree& tree) -> std::ostream&;

   class Tree{
      private:
         Node *root;
      public:
         auto friend operator<<(std::ostream& os,const Tree& tree) -> std::ostream&;
   };
а потом:
Код:
auto BSTree::operator<<(std::ostream& os,const Tree& tree) -> std::ostream&;
Цитата:
Сообщение от NDrago Посмотреть сообщение
второй сработал,в чем разница? ОО,вот сейчас сижу в полнейшем замешательстве
В незнании базовых вещей.
p51x вне форума Ответить с цитированием
Старый 02.05.2018, 12:32   #8
NDrago
Пользователь
 
Регистрация: 22.09.2017
Сообщений: 45
По умолчанию

кажется я понял,спасибо большое за помощь)
NDrago вне форума Ответить с цитированием
Старый 02.05.2018, 13:10   #9
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Сработает, если правильно запишите.
Кстати, g++ откомпилировал и без дополнительного объявления, только выдал предупреждение:
Код:
tt.cpp:5:6: warning: 'std::ostream& BSTree::operator<<(std::ostream&, const BSTree::Tree&)' has not been declared within BSTree
 auto BSTree::operator<<(std::ostream& os,const Tree& tree) -> std::ostream&{
      ^~~~~~
In file included from tt.cpp:3:0:
tt.hpp:12:22: note: only here as a friend
          auto friend operator<<(std::ostream& os,const Tree& tree) -> std::ostream&;
                      ^~~~~~~~
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c++ дружественные функции Pinguin007 Помощь студентам 0 01.10.2016 09:25
Дружественные функции Alexandr- Помощь студентам 2 16.11.2013 22:36
Дружественные функции midiss Visual C++ 0 20.05.2013 19:11
Дружественные функции Leon S.Kennedy Общие вопросы C/C++ 3 05.12.2011 17:22