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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.64
xadjek
 Аватар для xadjek
36 / 36 / 4
Регистрация: 05.06.2011
Сообщений: 306
28.11.2011, 01:08     Шаблонная функция #1
Учу 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;
}
где ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2011, 01:08     Шаблонная функция
Посмотрите здесь:

не работает шаблонная функция C++
C++ Шаблонная функция С++
C++ шаблонная функция С++
Шаблонная функция C++
Шаблонная функция C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
28.11.2011, 01:12     Шаблонная функция #2
xadjek, обратите внимание на эту строчку:

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

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

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

Ещё один вариант: запихивать собственные функции/классы в своё личное пространство имён.
Что бы гарантированно не поиметь проблем с именами внешних библиотек
Yandex
Объявления
28.11.2011, 01:25     Шаблонная функция
Ответ Создать тему
Опции темы

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