С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
#1

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

03.03.2013, 18:00. Просмотров 356. Ответов 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;
}
битый час бью голову, не могу сообразить как это реализовать.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2013, 18:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос оператор-друг для нешаблонного класса, вложенного в шаблонный (C++):

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

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * - C++
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

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

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса - C++
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B и obj_B = obj_A? Добавлено через 9...

Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка - C++
Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка. Всем огромное спасибо за помощь! |

Как вынести описание методов вложенного класса за пределы класса? - C++
Подскажите, пожалуйста, как мне вынести описание методов вложенного класса за пределы класса?

7
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
03.03.2013, 18:51 #2
хммм, а давать объявление класса внутри A - принципиально важно, да? Для чего, если не секрет?
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
03.03.2013, 18:57  [ТС] #3
Цитата Сообщение от ITcrusader Посмотреть сообщение
а давать объявление класса внутри A - принципиально важно, да?
теперь уже принципиально

Цитата Сообщение от ITcrusader Посмотреть сообщение
Для чего, если не секрет?
iterator. Хотя в той же STL итераторы - отдельные классы (т.е. не вложенные), но мне уже просто интересно сделать именно так.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.03.2013, 19:30 #4
Помню тоже наталкивался на похожие проблемы, именно когда хотел сделать правильные, типобезопасные итераторы. В итоге так ничего и не нашёл. Видимо, где-то тут уже предел шаблонной системы типов Плюсов.
1
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 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;
}
3
icpu
369 / 283 / 65
Регистрация: 10.03.2011
Сообщений: 1,219
Записей в блоге: 2
03.03.2013, 19:38 #6
Schizorb, тогда теряется гибкость именно создания кода.

Не по теме:

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

1
DU
1484 / 1130 / 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 вызывается саму себя рекурсивно. похоже на баг студийный.
1
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
03.03.2013, 20:13  [ТС] #8
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Помню тоже наталкивался на похожие проблемы, именно когда хотел сделать правильные, типобезопасные итераторы. В итоге так ничего и не нашёл. Видимо, где-то тут уже предел шаблонной системы типов Плюсов.
Хорошо, если это реально не возможно, тогда я сегодня спокойно буду спать Просто думал, что я туплю.

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

Не по теме:

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

0
03.03.2013, 20:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2013, 20:13
Привет! Вот еще темы с ответами:

Чем отличается шаблонный метод класса от шаблонного класса? - C++
Чем отличается шаблонный метод класса от шаблонного класса???????ПЛИЗ!!!!Если можно немного ссылок на летературу

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

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

В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! - C++
Друзья! Почему так? #include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; //Вот главный класс class A{ ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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