Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
#1

оператор-друг для нешаблонного класса, вложенного в шаблонный - C++

03.03.2013, 18:00. Просмотров 343. Ответов 7
Метки нет (Все метки)

Привет!
Суть проблемы в заголовке темы.

Пример того, что мне надо.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class T>
class A
{
public:
    class B
    {
    public:
        friend void operator + (int, B);
    };
};
 
template <class T>
void operator + (int, typename A<T>::B) {std::cout << "HERE" << std::endl;}
 
int main()
{
    A<int>::B a;
    // 10 + a; вот так не компилируется
    operator + <int>(10, a); // но  это совсем не выход
    return 0;
}
битый час бью голову, не могу сообразить как это реализовать.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2013, 18:00     оператор-друг для нешаблонного класса, вложенного в шаблонный
Посмотрите здесь:

Шаблонный оператор не шаблонного класса - C++
Пытаюсь создать альтернативный оператор выделения памяти для своей библиотеки. С целью получить возможность передавать дополнительную...

Какой должен быть синтаксис для использования вложенного шаблонного класса? - C++
Никак не могу найти, как это правильно написать? template &lt;class T&gt; class List { private: template &lt;T&gt; class Node { T...

Оператор вложенного цикла - C++
Может ли внешний оператор вложенного цикла не выполниться ни разу?

Шаблонный оператор присваивания в шаблонном классе - C++
Почему, в таком коде, срабатывает оператор присваивания по умолчанию? template &lt;class T&gt; class A { T x; public: A(T...

Использование вложенного класса - C++
Доброго времени суток. Решил подтянуть знания в базовых алгоритмах и структурах данных, а заодно попрактиковаться в шаблонах и обобщенном...

Перегрузить для класса оператор == - C++
немогу написать продолжение кода... нужно написать : перегрузить для данного класса оператор ==, вычисляющий пробег автомобиля с...

оператор присваивания для класса - C++
Помогите, пожалуйста. Требуется написать оператор присваивания для данного класса class ARRAY{ int size; double **m; public: ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
03.03.2013, 18:51     оператор-друг для нешаблонного класса, вложенного в шаблонный #2
хммм, а давать объявление класса внутри A - принципиально важно, да? Для чего, если не секрет?
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
03.03.2013, 18:57  [ТС]     оператор-друг для нешаблонного класса, вложенного в шаблонный #3
Цитата Сообщение от ITcrusader Посмотреть сообщение
а давать объявление класса внутри A - принципиально важно, да?
теперь уже принципиально

Цитата Сообщение от ITcrusader Посмотреть сообщение
Для чего, если не секрет?
iterator. Хотя в той же STL итераторы - отдельные классы (т.е. не вложенные), но мне уже просто интересно сделать именно так.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.03.2013, 19:30     оператор-друг для нешаблонного класса, вложенного в шаблонный #4
Помню тоже наталкивался на похожие проблемы, именно когда хотел сделать правильные, типобезопасные итераторы. В итоге так ничего и не нашёл. Видимо, где-то тут уже предел шаблонной системы типов Плюсов.
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
03.03.2013, 19:32     оператор-друг для нешаблонного класса, вложенного в шаблонный #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
А если определить функцию прямо внутри класса? тогда проблем с выведением типа не должно быть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
template <class T>
class A
{
public:
    class B
    {
    public:
        friend void operator + (int, B) {std::cout << "HERE" << std::endl;}
    };
};
 
int main()
{
    A<int>::B a;
    10 + a;
    
    return 0;
}
icpu
321 / 226 / 43
Регистрация: 10.03.2011
Сообщений: 1,084
Записей в блоге: 2
03.03.2013, 19:38     оператор-друг для нешаблонного класса, вложенного в шаблонный #6
Schizorb, тогда теряется гибкость именно создания кода.

Не по теме:

Kastaneda, хотел сразу написать, но решил подождать:
Начальная задумка была слишком мудрёная. Итоговый код почти наверняка вызывал бы обильное кровотечение из глаз читающего.

DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
03.03.2013, 20:12     оператор-друг для нешаблонного класса, вложенного в шаблонный #7
вот может немного модифицированный предыдущий вариант устроит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
template <class T>
class A
{
public:
    class B
    {
    public:
        friend void plus(int, B);
        friend void operator + (int i, B b) { plus<T>(i, b); }
    };
};
 
template <class T>
void plus(int, typename A<T>::B)
{
    std::cout << "HERE" << std::endl;
}
 
int main()
{
    A<int>::B a;
    10 + a;
    return 0;
}
или даже так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
template <class T>
class A
{
public:
    class B
    {
    public:
        template <class Y>
        friend void operator + (int, typename A<Y>::B);
 
        friend void operator + (int i, B b) { operator + <T>(i, b); }
    };
};
 
template <class T>
void operator + (int, typename A<T>::B)
{
    std::cout << "HERE" << std::endl;
}
 
int main()
{
    A<int>::B a;
    10 + a;
    return 0;
}
Добавлено через 8 минут
и еще забавная штука у VS2008.
если закоментировать строки 18-22, то код компилится и линкуется, только вот функция на строке 14 вызывается саму себя рекурсивно. похоже на баг студийный.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2013, 20:13     оператор-друг для нешаблонного класса, вложенного в шаблонный
Еще ссылки по теме:

Оператор присвоения для класса - C++
Никак не получается написать оператор присвоения. Помогите пожалуйста! #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std;...

Описать конструктор вложенного класса - C++
Привет всем! пожалуйста объясните как правильно описать конструктор вложенного класса в .cpp и доступ к переменной (чтобы присвоить...

Объявление объекта вложенного класса - C++
Есть структура наподобие: template&lt;class T&gt; class A{ //...... public: class B { int dd; int mm; int yy; ...

Реализовать оператор [] для класса String - C++
Однако на этот раз оператор должен реализовывать нестандартное поведение: оператор нужно реализовать таким образом, чтобы для объекта str...

Шаблонный метод класса - C++
Имеется следующая ситуация: template &lt;class T&gt; class Array : public std::deque&lt;boost::shared_ptr&lt;T&gt; &gt; { public: }; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
03.03.2013, 20:13  [ТС]     оператор-друг для нешаблонного класса, вложенного в шаблонный #8
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Помню тоже наталкивался на похожие проблемы, именно когда хотел сделать правильные, типобезопасные итераторы. В итоге так ничего и не нашёл. Видимо, где-то тут уже предел шаблонной системы типов Плюсов.
Хорошо, если это реально не возможно, тогда я сегодня спокойно буду спать Просто думал, что я туплю.

Schizorb, спасибо, я как-то даже не думал об этом.

Не по теме:

Цитата Сообщение от icpu Посмотреть сообщение
Начальная задумка была слишком мудрёная. Итоговый код почти наверняка вызывал бы обильное кровотечение из глаз читающего.
Да это я КР для ВУЗа делаю. Собственно по условию задания этого и не надо, просто, как всегда, решил "немного" усложнить задание

Yandex
Объявления
03.03.2013, 20:13     оператор-друг для нешаблонного класса, вложенного в шаблонный
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru