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

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

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

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

26.11.2010, 16:22. Просмотров 4061. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2010, 16:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как определить дружественную функцию шаблонного класса? (C++):

Как переопределить дружественную функцию ввода для класса наследника - C++
Есть класс предок, который имеет такую вот дружественную функцию ввода: friend ifstream &amp; operator &gt;&gt;(ifstream &amp; inf, Tovar &amp; obj) ...

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evgen88
42 / 42 / 5
Регистрация: 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 / 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> не одно и тоже!
0
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
Эксперт С++
3049 / 1694 / 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);
}
6
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3826 / 2084 / 532
Регистрация: 18.10.2014
Сообщений: 3,699
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
Нарушитель
6578 / 2759 / 476
Регистрация: 15.11.2014
Сообщений: 6,105
Завершенные тесты: 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Эксперт С++
3826 / 2084 / 532
Регистрация: 18.10.2014
Сообщений: 3,699
17.12.2016, 04:18 #9
Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
    friend A operator +(const A&,const A&)const
А что это за const в конце?
0
Lunix
0 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 35
17.12.2016, 10:17 #10
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А что это за const в конце?
что бы бонстанты тоже можно было складывать...
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3826 / 2084 / 532
Регистрация: 18.10.2014
Сообщений: 3,699
17.12.2016, 10:31 #11
Цитата Сообщение от Lunix Посмотреть сообщение
что бы бонстанты тоже можно было складывать...
Friend-функция, определенная таким образом, не является членом класса, по каковой причине никакого const в конце у нее быть не может. Все const, которые ей нужны, "что бы бонстанты тоже можно было складывать", уже указаны в типах параметров. Принцип "кашу маслом не испортишь" тут не работает.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2016, 10:31
Привет! Вот еще темы с ответами:

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

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

Как добавить дружественную функцию в класс - C++
Написал код, а как добавить функцию friend? #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; using namespace std; ...

Можно ли объявить дружественную функцию как шаблон? - C++
Так всё работает: template&lt;class T&gt; class random { /*всячина*/ public: friend void function(random&lt;int&gt;&amp;); ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.12.2016, 10:31
Ответ Создать тему
Опции темы

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