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

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

Восстановить пароль Регистрация
 
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
03.03.2013, 18:00     оператор-друг для нешаблонного класса, вложенного в шаблонный #1
Привет!
Суть проблемы в заголовке темы.

Пример того, что мне надо.
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++ Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка
оператор присваивания для класса C++
Описать конструктор вложенного класса C++
C++ Какой должен быть синтаксис для использования вложенного шаблонного класса?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
03.03.2013, 18:51     оператор-друг для нешаблонного класса, вложенного в шаблонный #2
хммм, а давать объявление класса внутри A - принципиально важно, да? Для чего, если не секрет?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
03.03.2013, 18:57  [ТС]     оператор-друг для нешаблонного класса, вложенного в шаблонный #3
Цитата Сообщение от ITcrusader Посмотреть сообщение
а давать объявление класса внутри A - принципиально важно, да?
теперь уже принципиально

Цитата Сообщение от ITcrusader Посмотреть сообщение
Для чего, если не секрет?
iterator. Хотя в той же STL итераторы - отдельные классы (т.е. не вложенные), но мне уже просто интересно сделать именно так.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.03.2013, 19:30     оператор-друг для нешаблонного класса, вложенного в шаблонный #4
Помню тоже наталкивался на похожие проблемы, именно когда хотел сделать правильные, типобезопасные итераторы. В итоге так ничего и не нашёл. Видимо, где-то тут уже предел шаблонной системы типов Плюсов.
Schizorb
 Аватар для Schizorb
508 / 460 / 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
 Аватар для icpu
276 / 181 / 36
Регистрация: 10.03.2011
Сообщений: 863
Записей в блоге: 2
03.03.2013, 19:38     оператор-друг для нешаблонного класса, вложенного в шаблонный #6
Schizorb, тогда теряется гибкость именно создания кода.

Не по теме:

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

DU
1477 / 1053 / 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++ Шаблонный оператор присваивания в шаблонном классе
Оператор вложенного цикла C++
Шаблонный оператор не шаблонного класса C++

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

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

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

Не по теме:

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

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

Текущее время: 10:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru