Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.59/32: Рейтинг темы: голосов - 32, средняя оценка - 4.59
Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
1

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

26.11.2010, 16:22. Просмотров 6649. Ответов 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;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2010, 16:22
Ответы с готовыми решениями:

Как переопределить дружественную функцию ввода для класса наследника
Есть класс предок, который имеет такую вот дружественную функцию ввода: friend ifstream &amp;...

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); }...

Перегрузка операций (Создать класс вещественных чисел (double); определить оператор +, как функцию-элемент и – как дружественную функцию)
помогите решить пожалуйста Задание 2. Бинарная операция Создать класс вещественных чисел...

Определить унарный оператор ++ как дружественную функцию
Есть программа: #include &quot;stdafx.h&quot; #include&lt;iostream&gt; #include&lt;conio.h&gt; using namespace std;...

Как прописать шаблонную функцию внутри шаблонного класса?
Как объявить шаблонную функцию/*типа iterator*/ внутри шаблонного класса?

10
Evgen88
42 / 42 / 12
Регистрация: 04.11.2010
Сообщений: 119
26.11.2010, 16:43 2
Попробуй при объявлении функции внутри класса после знака операции через пробел прописать <>.
0
Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
26.11.2010, 16:49  [ТС] 3
Я думал ранее над этим (только не внутри класса), но увы, не помогает..((
0
Evgen88
42 / 42 / 12
Регистрация: 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> не одно и тоже!
0
26.11.2010, 16:58
Sasuke
1 / 1 / 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;
}
0
Mr.X
Эксперт С++
3193 / 1720 / 435
Регистрация: 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);
}
7
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5778 / 2779 / 758
Регистрация: 18.10.2014
Сообщений: 5,002
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;
}
0
hoggy
Эксперт С++
7408 / 3334 / 689
Регистрация: 15.11.2014
Сообщений: 7,621
Завершенные тесты: 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;
   }
};
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5778 / 2779 / 758
Регистрация: 18.10.2014
Сообщений: 5,002
17.12.2016, 04:18 9
Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
    friend A operator +(const A&,const A&)const
А что это за const в конце?
0
Lunix
6 / 6 / 5
Регистрация: 05.04.2016
Сообщений: 67
17.12.2016, 10:17 10
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А что это за const в конце?
что бы бонстанты тоже можно было складывать...
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5778 / 2779 / 758
Регистрация: 18.10.2014
Сообщений: 5,002
17.12.2016, 10:31 11
Цитата Сообщение от Lunix Посмотреть сообщение
что бы бонстанты тоже можно было складывать...
Friend-функция, определенная таким образом, не является членом класса, по каковой причине никакого const в конце у нее быть не может. Все const, которые ей нужны, "что бы бонстанты тоже можно было складывать", уже указаны в типах параметров. Принцип "кашу маслом не испортишь" тут не работает.
0
17.12.2016, 10:31
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2016, 10:31

Передача параметров в дружественную функцию класса
Всем доброго времени суток. Читал про дружественные функции, в учебнике по которому учусь написано,...

Хранение в map указателя на функцию-член шаблонного класса
Здравствуйте! Сделал я себе вызов написать джунгли из ООП деревьев, типо, объекты обмениваются...

Как для шаблонного класса определить действие для частного случая
Всем привет. Подскажите как для шаблонного класса определить действие для частного случая. По...


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

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

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