Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 20.09.2017
Сообщений: 127
1

Шаблоны, ошибка "неоднозначный вызов перегруженной функции"

28.04.2018, 22:02. Показов 3130. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <iostream>
 
using namespace std;
 
void CheckInput(int &);
void CheckInput(double &);
void CheckInput(float &);
 
int head();
 
template <typename T>
void swap(T &x, T &y) 
{
  T z = x;
  x = y;
  y = z;
}
 
template <typename B>
void CheckInput(B &value)
{
    while(!(cin >> value))
    {
        cin.clear();
        while(cin.get() != '\n');
        cout << "Попробуйте ещё раз!: ";
    }
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    int choice = head();
 
    system("cls");
 
    switch(choice)
    {
    case 1:
        {
 
            double a,b;
 
            cout << "Введите первое значение: ";
            CheckInput(a);
 
            cout << "Введите второе значение: ";
            CheckInput(b);
 
            cout << "a = " << a << ", b = " << b << endl;
 
            swap<double>(a,b);
 
            cout << "После замены местами: a = " << a << ", b = " << b << endl;
        
 
 
        }
    case 2:
        {
            int a,b;
 
            cout << "Введите первое значение: ";
            CheckInput(a);
 
            cout << "Введите второе значение: ";
            CheckInput(b);
 
            cout << "a = " << a << ", b = " << b << endl;
 
            swap<int>(a,b);
 
            cout << "После замены местами: a = " << a << ", b = " << b << endl;   
 
 
 
        }
    
    case 3:
        {
            float a,b;
 
            cout << "Введите первое значение: ";
            CheckInput(a);
 
            cout << "Введите второе значение: ";
            CheckInput(b);
 
            cout << "a = " << a << ", b = " << b << endl;
 
            swap<float>(a,b);
 
            cout << "После замены местами: a = " << a << ", b = " << b << endl;
 
 
 
        }
 
    default: cout << "Ошибка ввода!" << endl; return -1; break;
    }
 
    system("pause");
    return 0;
}
 
int head()
{
    int choice;
 
    cout << "Выберите тип, с которым вы будете работать в дальнейшем: 1)double;\n2)integer;\n3)float.\n\nВаш выбор: ";
    CheckInput(choice);
 
    return choice;
}

ОШИБКА:


.\template.cpp(43) : error C2668: swap: неоднозначный вызов перегруженной функции
1> .\template.cpp(12): может быть 'void swap<double>(T &,T &)'
1> with
1> [
1> T=double
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\utility(16): или 'void std::swap<double>(_Ty &,_Ty &)'
1> with
1> [
1> _Ty=double
1> ]
1> при попытке сопоставить список аргументов '(double, double)'
1>.\template.cpp(62) : error C2668: swap: неоднозначный вызов перегруженной функции
1> .\template.cpp(12): может быть 'void swap<int>(T &,T &)'
1> with
1> [
1> T=int
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\utility(16): или 'void std::swap<int>(_Ty &,_Ty &)'
1> with
1> [
1> _Ty=int
1> ]
1> при попытке сопоставить список аргументов '(int, int)'
1>.\template.cpp(82) : error C2668: swap: неоднозначный вызов перегруженной функции
1> .\template.cpp(12): может быть 'void swap<float>(T &,T &)'
1> with
1> [
1> T=float
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\utility(16): или 'void std::swap<float>(_Ty &,_Ty &)'
1> with
1> [
1> _Ty=float
1> ]
1> при попытке сопоставить список аргументов '(float, float)'



По сути, шаблон в самом начале должен создавать для функции свап тип для приёма, но почему-то ругается. Или это я чего-то не понимаю. При этом шаблон на функции проверки правильности ввода работает прекрасно
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2018, 22:02
Ответы с готовыми решениями:

Ошибка: неоднозначный вызов перегруженной функции
Ошибка:= error C2668: TCalc::TCalc: неоднозначный вызов перегруженной...

Ошибка sin: неоднозначный вызов перегруженной функции
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;iomanip&gt; using namespace std; int main() {...

Ошибка C2668: mult: неоднозначный вызов перегруженной функции
Помогите пожалуйста, не знаю как правильно избавиться от ошибки. Исчезает только если из объявления...

Ошибка C2668: sqrt: неоднозначный вызов перегруженной функции
Добрый вечер. Это опять я, чайник. Решаю такую задачу: &quot;Вывести на экран N-ое число из ряда...

8
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
28.04.2018, 22:05 2
Убери самодельный swap() и используй std::swap(). Либо имя другое придумай.
1
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
28.04.2018, 22:07 3
Компилятор просто не знает какой swap ему вызвать - глобальный или из std (поскольку используется директива using namespace std;)
2
1 / 1 / 0
Регистрация: 20.09.2017
Сообщений: 127
28.04.2018, 22:11  [ТС] 4
Сорян, туплю) Забыл цифру в названии записать)
Спасибо)

UPD. После смены названия на usSwap (user's swap) появилась новая проблема. С чего-то начал ругаться компоновщик:

1>template.obj : error LNK2028: ссылка на неразрешенную лексему (0A0002B8) "void __cdecl CheckInput(float &)" (?CheckInput@@$$FYAXAAM@Z) в функции "int __cdecl main(void)" (?main@@$$HYAHXZ)
1>template.obj : error LNK2028: ссылка на неразрешенную лексему (0A0002B9) "void __cdecl CheckInput(double &)" (?CheckInput@@$$FYAXAAN@Z) в функции "int __cdecl main(void)" (?main@@$$HYAHXZ)
1>template.obj : error LNK2028: ссылка на неразрешенную лексему (0A0002BA) "void __cdecl CheckInput(int &)" (?CheckInput@@$$FYAXAAH@Z) в функции "int __cdecl head(void)" (?head@@$$FYAHXZ)
1>template.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl CheckInput(int &)" (?CheckInput@@$$FYAXAAH@Z) в функции "int __cdecl head(void)" (?head@@$$FYAHXZ)
1>template.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl CheckInput(float &)" (?CheckInput@@$$FYAXAAM@Z) в функции "int __cdecl main(void)" (?main@@$$HYAHXZ)
1>template.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl CheckInput(double &)" (?CheckInput@@$$FYAXAAN@Z) в функции "int __cdecl main(void)" (?main@@$$HYAHXZ)
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
28.04.2018, 22:16 5
Кстати, явно указывать в уговых скобках тип излишне, - тип сам выводится из передаваемых аргументов функции:
C++
1
2
double a, b;
swap(a,b); // <-- выводимый тип double
0
1 / 1 / 0
Регистрация: 20.09.2017
Сообщений: 127
28.04.2018, 22:17  [ТС] 6
Просто убрать первоначально забыл. Посоветуй, что с ошибками выше сделать, пожалуйста)
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
28.04.2018, 22:25 7
Там же всё написано - функции объявлены, а реализации нет. Убери их.
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
28.04.2018, 22:26 8
Цитата Сообщение от berkut234 Посмотреть сообщение
Посоветуй, что с ошибками выше сделать,
Тут все просто:
C++
1
2
3
void CheckInput(int &);
void CheckInput(double &);
void CheckInput(float &);
- для этих функций отсутствуют определения. То что, шабонная функция void CheckInput(B &value) полностью определена не поможет, так как компилятору "болие по душе" не шаблонные функции.
В этом можно убедится заменив все вызовы CheckInput на вызовы с явным шаблонным аргументом, например CheckInput<float>(a); - ошибка исчезнет.
0
1 / 1 / 0
Регистрация: 20.09.2017
Сообщений: 127
28.04.2018, 22:28  [ТС] 9
С начала так и делал, просто решил попробовать упростить код на 2 функции. Спасибо.
0
28.04.2018, 22:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2018, 22:28
Помогаю со студенческими работами здесь

Ошибка: error C2668: abs: неоднозначный вызов перегруженной функции - C++
Мне выкидывает ошибку при сборке. 1&gt; CCRakNetSlidingWindow.cpp...

Ошибка: error C2668: abs: неоднозначный вызов перегруженной функции
Мне выкидывает ошибку при сборке. 1&gt; QueueTest.cpp 1&gt;c:\documents and...

Ошибка 2, error C2668: pow: неоднозначный вызов перегруженной функции
Пытаюсь разобраться с функциями. И потому усложнил обычный пример. Вылезла ошибка: Ошибка 2, error...

Ошибка в программе error C2668: std::to_string: неоднозначный вызов перегруженной функции
FILE *f1; f1 = fopen(&quot;matrix.txt&quot;, &quot;w&quot;); for (unsigned int i = 0; i &lt; matrix.size();...

Неоднозначный вызов перегруженной функции
При добавлении элементов получаю ошибку struct FDoc { std::string bief;...

Неоднозначный вызов перегруженной функции
Всех приветствую. Есть функция: int TryInsteadCommand(CString textIn, CString command=L&quot;&quot;,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru