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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.64
xadjek
36 / 36 / 4
Регистрация: 05.06.2011
Сообщений: 306
#1

Шаблонная функция - C++

28.11.2011, 01:08. Просмотров 3789. Ответов 5
Метки нет (Все метки)

Учу c++, в книге приводится вот такой листинг примера работы шаблонной функции, однако он не компилится, выдает ошибку
Код
error C2668: swap: неоднозначный вызов перегруженной функции
вот сам листинг
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>
#include <conio.h>
using namespace std;
template<typename T>
void swap(T &a,T &b);
 
int main()
{cout<<"vvedi x i y-> ";
int x,y;
cin>>x>>y;
cout<<"x="<<x<<"y="<<y<<endl;
swap(x,y);
cout<<"x="<<x<<"y="<<y<<endl;
double q,w;
q=x/10;
w=y/10;
cout<<"q="<<x<<"w="<<y<<endl;
swap(q,w);
cout<<"q="<<x<<"w="<<y<<endl;
return 0;
}
template<typename T>
void swap(T &a,T &b)
{T temp;
temp=a;
a=b;
b=temp;
}
где ошибка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2011, 01:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблонная функция (C++):

Шаблонная функция - C++
Дорогие форумчане, нуждаюсь в вашей помощи: имеется несколько функций, с большим объемом кода. Чтоб не повторять код для функций с другим...

Шаблонная функция - C++
Всем привет! Подскажите пожалуйста, почему не работает следующее объявление функции-шаблона? template &lt;class T&gt; class Base { ...

Шаблонная функция - C++
Как &quot;научить&quot; шаблонную функцию отличать массив от контейнера, то есть если написать: template &lt;class contains, class type&gt; type...

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

шаблонная функция С++ - C++
написать шаблонную функцию что подсчитывает сколько в массиве пар соседних элементов с одинаковыми значениями. буду признателен ))

Шаблонная функция - C++
Необходимо сделать шаблонную функцию, в которой x заменяется на y, а y заменяется на x: void f(int *x, float *y) Помогите...

5
Bers
Заблокирован
28.11.2011, 01:12 #2
xadjek, обратите внимание на эту строчку:

C++
1
using namespace std;
В стандартной библиотеке так же, есть функция swap()

Вы уверены, что вызываете именно ту функцию, которую имеете ввиду, в своём коде?

Подробности о стандартном swap() можно узнать, например, здесь:
http://www.cplusplus.com/reference/algorithm/swap/
0
Сыроежка
Заблокирован
28.11.2011, 01:18 #3
Цитата Сообщение от xadjek Посмотреть сообщение
Учу c++, в книге приводится вот такой листинг примера работы шаблонной функции, однако он не компилится, выдает ошибку
Код
error C2668: swap: неоднозначный вызов перегруженной функции
вот сам листинг
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>
#include <conio.h>
using namespace std;
template<typename T>
void swap(T &a,T &b);
 
int main()
{cout<<"vvedi x i y-> ";
int x,y;
cin>>x>>y;
cout<<"x="<<x<<"y="<<y<<endl;
swap(x,y);
cout<<"x="<<x<<"y="<<y<<endl;
double q,w;
q=x/10;
w=y/10;
cout<<"q="<<x<<"w="<<y<<endl;
swap(q,w);
cout<<"q="<<x<<"w="<<y<<endl;
return 0;
}
template<typename T>
void swap(T &a,T &b)
{T temp;
temp=a;
a=b;
b=temp;
}
где ошибка?
Во-первых, компиляторы в своих сообщениях об ошибках обычно сообщают, какие именно функции конфликтуют. Поэтому надо 1) внимательно читать сообщения компилятора об ошибке; 2) приводить на форуме полный текст сообщения об ошибке.


Во-вторых, ошибка у вас заключается в директиве

C++
1
using namespace std;
Вы тем самым ввели в глобальное пространство имен все имена из стандартного пространства имен. А в стандартном пространстве имен существует функция swap. Так как компилятор теперь в глобальном пространстве имен находит две функции с одним и тем же именем и параметрами, одну - из пространства имен std::, другую - объявленную вами, то не знает, какую из них выбрать.

Как исправить ошибку? Нужно пользоваться квалифицированным именем функции. Вызывайте свою функцию указав перед ней префикс глобального пространства имен

C++
1
::swap( x, y );
Тогда конфликта имен у вас не будет.
0
xadjek
36 / 36 / 4
Регистрация: 05.06.2011
Сообщений: 306
28.11.2011, 01:20  [ТС] #4
Цитата Сообщение от Bers Посмотреть сообщение
xadjek, обратите внимание на эту строчку:

C++
1
using namespace std;
В стандартной библиотеке так же, есть функция swap()

Вы уверены, что вызываете именно ту функцию, которую имеете ввиду, в своём коде?

Подробности о стандартном swap() можно узнать, например, здесь:
http://www.cplusplus.com/reference/algorithm/swap/
спасибо большое, изменил название функции на Swap и все заработало...просто не знал что в стандартной библиотеке присутсвует такая функция
0
Сыроежка
Заблокирован
28.11.2011, 01:24 #5
Цитата Сообщение от xadjek Посмотреть сообщение
спасибо большое, изменил название функции на Swap и все заработало...просто не знал что в стандартной библиотеке присутсвует такая функция
Вам не надо было менять имя на Swap. Вам просто нужно было явно указать, из какого пространства имен вы вызываете функцию. Я об этом написал в своем предыдущем комментарии.
0
Bers
Заблокирован
28.11.2011, 01:25 #6
Цитата Сообщение от xadjek Посмотреть сообщение
спасибо большое, изменил название функции на Swap и все заработало...просто не знал что в стандартной библиотеке присутсвует такая функция
Что бы гарантированно не иметь подобных проблем, то лучше вообще не использовать
записи типа: using namespace std; на глобальном уровне.

Ещё один вариант: запихивать собственные функции/классы в своё личное пространство имён.
Что бы гарантированно не поиметь проблем с именами внешних библиотек
0
28.11.2011, 01:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2011, 01:25
Привет! Вот еще темы с ответами:

Линковщик и шаблонная функция - C++
Добрый вечер, почему если реализовать функцию в header'e и подключить её в разные модули - already defined, а если функция шаблонная ...

Шаблонная функция параметры - C++
Подскажите, где можно посмотреть перечень возможных команд в шаблонных функциях вроде: template &lt;class InputIterator, class T&gt; typename...

не работает шаблонная функция - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;list&gt; using namespace std; template &lt;class V, class E&gt; struct graph { ...

Шаблонная функция не работает - C++
#include &lt;iostream&gt; using namespace std; template &lt;class T&gt;void Print_Car(T &amp;a); struct Car { int Number; char Color; ...


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

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

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