Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка функции из namespace std, Не компилириуется 
:(
    Опции темы
Dontshooot
Дата 24.6.2010, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 24.6.2010

Репутация: нет
Всего: нет



Доброго времени суток. Столкнулся с такой проблемой. Необходимо в описании класса перегрузить функцию из namespace std. Вот код:
Код

class ds_queue {
public:
    ds_queue();
    explicit ds_queue(size_t capacity);
    ds_queue(const ds_queue& that);
    ~ds_queue();
// Чтобы не засорять - вырезал оъявление нескольких функций
    friend void std::swap(ds_queue& q1, ds_queue& q2);
private:
//Кусок вырезан
};

namespace std{
    void swap(ds_queue& q1, ds_queue& q2);
};


При компиляции получаю

.../ds_queue.hpp|22|error: ‘void std::swap(ds_queue&, ds_queue&)’ should have been declared inside ‘std’|
PM MAIL   Вверх
mes
Дата 24.6.2010, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



при указании дружбы для функции из пространства имен необходимо, чтоб функция была объявлена в этом пространстве заранее.



--------------------
PM MAIL WWW   Вверх
Dontshooot
Дата 24.6.2010, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 24.6.2010

Репутация: нет
Всего: нет



то есть так?

Код

namespace std{
    void swap(ds_queue& q1, ds_queue& q2);
};

class ds_queue {
public:
    ds_queue();
    explicit ds_queue(size_t capacity);
    ds_queue(const ds_queue& that);
    ~ds_queue();
// Чтобы не засорять - вырезал оъявление нескольких функций
    friend void std::swap(ds_queue& q1, ds_queue& q2);
private:
//Кусок вырезан
};


Но тогда получаю ошибки
.../ds_queue.hpp|7|error: variable or field ‘swap’ declared void|
.../ds_queue.hpp|7|error: ‘ds_queue’ was not declared in this scope|

что в принципе логично
PM MAIL   Вверх
mes
Дата 24.6.2010, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Dontshooot @  24.6.2010,  21:44 Найти цитируемый пост)
то есть так?

да так smile

Цитата(Dontshooot @  24.6.2010,  21:44 Найти цитируемый пост)
Но тогда получаю ошибки
что в принципе логично 

ну так тип надо вначале продекларировать 
smile

угу получаются круг... только не замкнутый..
smile
Код

class C;
namespace NS {
   void f(C&,C&); 
}
class C {
  friend NS::f(C&, C&);
};
namespace NS {
   void f(C&,C&)
   {
   }
}


как выход из такого положения ,  определить swap как член класса, и уже его задействовать в  std::swap .
smile

Это сообщение отредактировал(а) mes - 24.6.2010, 23:50


--------------------
PM MAIL WWW   Вверх
Dontshooot
Дата 25.6.2010, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 24.6.2010

Репутация: нет
Всего: нет



Мне показалось странным что код скомпилился когда я добавил в начале using namespace std; и соответственно из описания функций убрал std::
PM MAIL   Вверх
bsa
Дата 26.6.2010, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Dontshooot, сделай метод swap. В паре с конструктором копирования он сильно облегчает работу. Например, освобождение памяти в этом случае достаточно будет сделать только в деструкторе, а, например, оператор присваивания будет выглядеть так:
Код
Class& Class::operator=(const Class &c) {
   Class(c).swap(*this);
   return *this;
}
В этом случае, std::swap вообще реализуется одной строчкой, и его можно сделать встраиваемым (inline).

Добавлено через 3 минуты и 10 секунд
Цитата(Dontshooot @ 25.6.2010,  10:35)
Мне показалось странным что код скомпилился когда я добавил в начале using namespace std; и соответственно из описания функций убрал std::

Ничего странного. Просто нельзя использовать функции, находящиеся в пространстве имен, без их предварительной декларации внутри namespace.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0758 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.