Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,702

Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему?

26.06.2012, 16:06. Показов 2764. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#include <stdio.h>
 
class klass {
public:
 klass() {}
 klass(int n) {}
 klass operator*(const klass &other){}
    
 //Сейчас всё компилится, но если расскоментить эту строку, то
 //компилиться не будет                                       
 
 //friend klass operator*(const int &chislo, klass &fr) {};   
    
 operator float () {};
};
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
int main () {
 klass h (7);
 klass h_ (5);
 klass h__ (h* h_);
 getchar ();
 return 0;
}
Такие вываливаются ошибки.

C++
1
2
3
4
In function 'int main()': 
[Warning] [enabled by default] 
klass klass::operator*(const klass&) 
klass operator*(const int&, klass&)
Тот есть вроде как компилятор не может выбрать между двумя операторами *. Но я бы на месте компилятора знал, что делать. У меня две переменых типа klass, h и h_, какие могу быть сомнения?
ВЫбирать надо
C++
1
klass operator*(const klass &other)
, никакими int в левой части и не пахнет

++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++=

Проблема почему-то исчезает если закомментить также
C++
1
operator float () {};
, но в реальном коде этот оператор НУЖЕН. Этот же код демонстрационный для задачи, упрощён для понимания поэтому кажется несколько надуманным. Спасибо, кто откликнется.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.06.2012, 16:06
Ответы с готовыми решениями:

Как выбрать нужный компилятор для сборки в Qt Creator?
Помогите разобратся с данным параметром Qt, не могу выбрать компилятор для своей сборки (ниже рисунок) сам компилятор настроен. Что делать?

Почему компилятор жалуется на неправильное использование оператора ?:
Query = &quot;INSERT INTO Transport (IsIn) VALUES('&quot; + Convert.ToBoolean(this.IsInCheckBox.IsChecked) ? '1' : '0'; +&quot;') Пользуюсь ?: так...

Почему компилятор ругается на то, что класс не объявлен при использовании оператора если?
......... if (i &lt; 3) { int b, c; cin &gt;&gt; b &gt;&gt; c; date myDate(a, b, c); } else ...

23
 Аватар для defer
577 / 256 / 18
Регистрация: 29.11.2010
Сообщений: 868
26.06.2012, 16:21
у меня этот код выдает такую ошибку
main.cpp|12|error: 'klass klass::operator*(const int&, klass&)' must take either zero or one argument|
что неудивительно, как вы такой оператор использовать собираетесь?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,702
26.06.2012, 16:29  [ТС]
Цитата Сообщение от defer Посмотреть сообщение
у меня этот код выдает такую ошибку
main.cpp|12|error: 'klass klass::operator*(const int&, klass&)' must take either zero or one argument|
что неудивительно, как вы такой оператор использовать собираетесь?
Это неважно. Такой оператор я использовать не буду. Код упрощён, я же говорю, пример демонстрационый. Чуть-чуть усложните чтобы ваш компилятор не выдавал этой ошибки и всё. Впрочем, вот:
C++
1
friend klass operator*(const int &chislo, klass &fr) {return klass (chislo);};
Так, думаю, пойдёт. У меня g++ 4.6.1
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
26.06.2012, 16:38
C++
1
friend klass operator*(const int &chislo, const klass &fr) {return klass(chislo);};
Добавлено через 1 минуту
То есть вот так вот все должно работать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class klass {
public:
 klass() {}
 klass(int n) {}
 klass operator*(const klass &other){}
    
 //Сейчас всё компилится, но если расскоментить эту строку, то
 //компилиться не будет                                       
 
 friend klass operator*(const int &chislo, const klass &fr) {};   
    
 operator float () {};
};
1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.06.2012, 18:20
Хм, интересное поведение. Мне компилятор сказал следующее:
ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second
Если добавить ко второму параметру friend-оператора квалификатор const, всё скомпилируется. Если убрать конвертер double - тоже. При этом вроде бы имеется два оператора:
klass operator*(const klass&, const class&)
и
klass operator*(const int&, klass&)
В месте вызова для первого имеется два точных соответствия, для второго преобразование и точное соответствие, т.е. по идее компилятор должен считать первый вариант лучшим и вызывать именно его... Помогайте найти в стандарте соответствующий пункт))
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
26.06.2012, 18:45
Я сам тоже искал причину, но так до конца и не понял. GCC при этом пишет еще и о неком встроенном операторе operator*(float, float):
main.cpp:32:18: error: ambiguous overload for 'operator*' in 'h * h_'
main.cpp:32:18: note: candidates are:
main.cpp:32:18: note: operator*(float, float) <built-in>
main.cpp:19:8: note: klass klass::operator*(const klass&)
main.cpp:24:15: note: klass operator*(const int&, klass&)
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.06.2012, 18:50
Toshkarik, хм, мой gcc 4.7.1 говорит только о двух кандидатах - оба рукописные...
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
26.06.2012, 19:02
У меня MinGW на том же GCC 4.7.1.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.06.2012, 19:04
омг, у меня тоже мингв... А на какой код у вас эти сообщения выдаются?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
26.06.2012, 19:17
Вот на такой, скопировал как есть:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class klass {
 public:
   klass() {}
   klass(int n) {}
   klass operator*(const klass &other){}                                     
 
   friend klass operator*(const int &chislo, klass &fr) {};   
    
   operator float () {};
};
 
int main () {
 klass h( 7 );
 klass h_( 5 );
 klass h__( h * h_ );
   
 return 0;
}
Добавлено через 3 минуты
Немного отформатировал пример, что бы было понятнее:
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
class someClass {
   friend someClass operator*( const int , someClass & );
   
 public:
   someClass();
   someClass( int );
   
   someClass operator*( const someClass & );
   
   operator float ();
   
 private:
   int x;
};
 
someClass::someClass()
   : x( 0 )
{
   
}
 
someClass::someClass( int n )
   : x( n )
{
   
}
 
someClass someClass::operator*( someClass &other ) {
   
}
 
someClass operator*( const int number, someClass &fr ) {
   
}
 
someClass::operator float () {
   return .0;
}
 
int main () {
 someClass h( 7 );
 someClass h_( 5 );
 someClass h__( h * h_ );
   
 return 0;
}
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
26.06.2012, 19:20
Цитата Сообщение от Toshkarik Посмотреть сообщение
error: 'someClass someClass::operator*(int, someClass&)' must take either zero or one argument
Это потому что метод получился .

Добавлено через 41 секунду
Цитата Сообщение от gray_fox Посмотреть сообщение
someClass::
это лишнее т.е.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
26.06.2012, 19:21
Да, это я уже подправил, мой косяк был.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.06.2012, 19:24
Toshkarik, и всё равно у меня только два кандидата... Но суть не в том, всё же интересно, почему компилятор не может разрешить перегрузку.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
26.06.2012, 19:26
Кстати, если main такой, то всё ок:
C++
1
2
3
int main () {
   klass() * klass();
}
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.06.2012, 19:27
А, стоп. Он может разрешить перегрузку. Я даже не заметил, что исполняемый файл создаётся, и что это только варнинг. Но всё же не понятно, откуда стандарт берёт неоднозначность при разрешении (видимо, gcc руководствуется дополнительными правилами в данном случае и всё-таки вывозит).
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
26.06.2012, 19:41
Я без -Werror компилирую и у меня именно ошибка получается.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.06.2012, 19:47
Toshkarik, да, с -pedantic действительно будет ошибка. Без него у меня исполняемый файл создаётся.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
26.06.2012, 19:47
Цитата Сообщение от Toshkarik Посмотреть сообщение
Я без -Werror компилирую и у меня именно ошибка получается.
-pedantic? У меня с -Wall только предупреждение (MinGW 4.7.0).
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
26.06.2012, 19:59
Да, с -pedantic.

Добавлено через 7 минут
Вот, что получается если еще перегрузить приведение к int:

main.cpp:69:21: error: ambiguous overload for 'operator*' in 'h * h_'
main.cpp:69:21: note: candidates are:
main.cpp:69:21: note: operator*(int, int) <built-in>
main.cpp:69:21: note: operator*(int, float) <built-in>
main.cpp:69:21: note: operator*(float, int) <built-in>
main.cpp:69:21: note: operator*(float, float) <built-in>
main.cpp:50:11: note: someClass someClass::operator*(const someClass&)
main.cpp:54:11: note: someClass operator*(int, someClass&)
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2012, 22:25
VS такое выдаёт:
1>------ Построение начато: проект: LAB, Конфигурация: Debug Win32 ------
1> lab04.cpp
1>d:\my c++projects\lab\lab04.cpp(1356): error C2666: klass::operator *: для 3 перегрузок есть подобные преобразования
1> d:\my c++projects\lab\lab04.cpp(1341): может быть "klass klass::operator *(const klass &)"
1> d:\my c++projects\lab\lab04.cpp(1346): или "klass operator *(const int &,klass &)" [найдено при поиске с зависимостью от аргументов]
1> или "встроенный оператор C++*(float, float)"
1> при попытке сопоставить список аргументов "(klass, klass)"
1> примечание: неоднозначность может быть вызвана корректировкой квалификации (const/volatile)
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Если объявить h_ как const, то исчезнет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.06.2012, 22:25
Помогаю со студенческими работами здесь

Почему без приведения типа невозможно выбрать нужный указатель на перегруженную функцию-член?
#include &lt;iostream&gt; #include &lt;functional&gt; using namespace std; class Callable { public: string operator() (string...

Есть два БП. Какой выбрать?
В общем, проблема такая: есть два БП. Один с нормальным охлаждением DEPO Computers ATX-400PNR (в поиске вылазит точно такая же модель,...

Что выбрать 9800GTX+ или GTS250? А может есть и другие альтернативы?
Дарофки всем админам, модерам и изерам нашего любимого портала! Хочу купить апгрейд (видео адаптер) на домашний ПК. Данная...

Выбрать из бд строку, если есть хотя бы 1 ключ, ключей может быть много
так намудрил как-то с названием темы. не знаю как точно выразить суть вопроса. есть бд, есть таблица. в ней содержится некоторая...

Замена материнской платы. Есть два варианта. Что выбрать?
Добрый день! Вышла из строя материнская плата iH55 на ПК. Мастер предлагает два варианта замены: 1)Материнская плата GIGABYTE GA-78LMT....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru