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

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

Войти
Регистрация
Восстановить пароль
 
Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
#1

Как определить дружественную функцию шаблонного класса? - C++

26.11.2010, 16:22. Просмотров 3622. Ответов 10
Метки нет (Все метки)

Подскажите, пожалуйста, как определить дружественную функцию какого-то определенного шаблона?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// например, делая это таким способом, компилятор ругается, выводя ошибку:
// error LNK2019: ссылка на неразрешенный внешний символ /// VS C++ 10 ///
// Я так понимаю, что после вызова "+" в мэйне, перегрузки компилятор не видет... 
// В чем проблема?
 
template <typename dat>
class A {
    dat n;
public:
    friend A operator +(const A&,const A&); 
};
 
template <typename dat>
A<dat> operator +(const A<dat>& a,const A<dat>& b) {
    return a.n+b.n;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2010, 16:22     Как определить дружественную функцию шаблонного класса?
Посмотрите здесь:

Как организовать дружественную функцию для печати массива C++
C++ Как прописать шаблонную функцию внутри шаблонного класса?
Перегрузка операций (Создать класс вещественных чисел (double); определить оператор +, как функцию-элемент и – как дружественную функцию) C++
C++ Можно ли объявить дружественную функцию как шаблон?
C++ Как для шаблонного класса определить действие для частного случая
Как переопределить дружественную функцию ввода для класса наследника C++
Вызов метода у шаблонного поля, шаблонного класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evgen88
42 / 42 / 5
Регистрация: 04.11.2010
Сообщений: 119
26.11.2010, 16:43     Как определить дружественную функцию шаблонного класса? #2
Попробуй при объявлении функции внутри класса после знака операции через пробел прописать <>.
Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
26.11.2010, 16:49  [ТС]     Как определить дружественную функцию шаблонного класса? #3
Я думал ранее над этим (только не внутри класса), но увы, не помогает..((
Evgen88
42 / 42 / 5
Регистрация: 04.11.2010
Сообщений: 119
26.11.2010, 16:58     Как определить дружественную функцию шаблонного класса? #4
t
C++
1
2
3
4
5
6
7
8
9
10
11
emplate <typename dat>
class A {
        dat n;
public:
        friend A operator +(const A&,const A&);  //после A желательно написать <dat>
};
 
template <typename dat>                                          //судя по коду функция должна возвращать     
A<dat> operator +(const A<dat>& a,const A<dat>& b) { //значение типа A<dat> 
        return a.n+b.n; //у тебя же возвращается значение типа dat
}
типы dat и A<dat> не одно и тоже!
Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
26.11.2010, 17:39  [ТС]     Как определить дружественную функцию шаблонного класса? #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// немного поспешил, когда писал этот пример. С ретурном в функции, конечно же, подправил. Добавил <dat>, как видите, и не помогло.. (( Дружиственные функции вообще работают с шаблонами?
template <typename dat>
class A {
        dat n;
public:
        friend A<dat> operator +(const A<dat>&,const A<dat>&); 
};
 
template <typename dat>
A<dat> operator +(const A<dat>& a,const A<dat>& b) {
        A<dat> c; c.n=a.n+b.n;
        return c;
}
Mr.X
Эксперт С++
3039 / 1684 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
26.11.2010, 18:41     Как определить дружественную функцию шаблонного класса? #6
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
//////////////////////////////////////////////////////////////////////////////////////
template <typename T>
class A 
{
    T n;
    
    template <typename U>
    friend 
    A<U> operator+ (const A<U>& a,const A<U>& b); 
};
////////////////////////////////////////////////////////////////////////////////////// 
template <typename T>
A<T> operator+ (const A<T>& a,const A<T>& b) 
{
    A<T> c; 
    c.n = a.n + b.n;
    return c;
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    A<int>  a;
    A<int>  b;
    A<int>  c(a + b);
}
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3512 / 1794 / 472
Регистрация: 18.10.2014
Сообщений: 3,312
16.12.2016, 00:20     Как определить дружественную функцию шаблонного класса? #7
Цитата Сообщение от Sasuke Посмотреть сообщение
Я думал ранее над этим (только не внутри класса), но увы, не помогает..((
Правильный ответ на первый вопрос (пусть и много воды утекло с тех пор)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <typename dat> class A;
template <typename dat> A<dat> operator +(const A<dat>& a,const A<dat>& b);
 
template <typename dat>
class A {
    dat n;
public:
    A(int) {}
    friend A operator +<>(const A&,const A&); 
};
 
template <typename dat>
A<dat> operator +(const A<dat>& a,const A<dat>& b) {
    return a.n+b.n;
}
hoggy
5982 / 2422 / 433
Регистрация: 15.11.2014
Сообщений: 5,370
Завершенные тесты: 1
16.12.2016, 12:46     Как определить дружественную функцию шаблонного класса? #8
C++
1
2
3
4
5
6
7
8
9
10
11
template <typename dat>
class A {
    dat n;
public:
    friend A operator +(const A&,const A&)const 
   {
       A a;
       a.n = a.n+b.n; 
       return a;
   }
};
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3512 / 1794 / 472
Регистрация: 18.10.2014
Сообщений: 3,312
17.12.2016, 04:18     Как определить дружественную функцию шаблонного класса? #9
Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
    friend A operator +(const A&,const A&)const
А что это за const в конце?
Lunix
0 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 33
17.12.2016, 10:17     Как определить дружественную функцию шаблонного класса? #10
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А что это за const в конце?
что бы бонстанты тоже можно было складывать...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2016, 10:31     Как определить дружественную функцию шаблонного класса?
Еще ссылки по теме:

C++ Определить унарный оператор ++ как дружественную функцию
Как бросить исключение из шаблонного класса? C++
Передача параметров в дружественную функцию класса C++
C++ Как добавить дружественную функцию в класс
Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? C++

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

Или воспользуйтесь поиском по форуму:
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3512 / 1794 / 472
Регистрация: 18.10.2014
Сообщений: 3,312
17.12.2016, 10:31     Как определить дружественную функцию шаблонного класса? #11
Цитата Сообщение от Lunix Посмотреть сообщение
что бы бонстанты тоже можно было складывать...
Friend-функция, определенная таким образом, не является членом класса, по каковой причине никакого const в конце у нее быть не может. Все const, которые ей нужны, "что бы бонстанты тоже можно было складывать", уже указаны в типах параметров. Принцип "кашу маслом не испортишь" тут не работает.
Yandex
Объявления
17.12.2016, 10:31     Как определить дружественную функцию шаблонного класса?
Ответ Создать тему
Опции темы

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