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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
26.06.2012, 16:06     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #1
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 () {};
, но в реальном коде этот оператор НУЖЕН. Этот же код демонстрационный для задачи, упрощён для понимания поэтому кажется несколько надуманным. Спасибо, кто откликнется.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2012, 16:06     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему?
Посмотрите здесь:

Выбрать из списка 2 любых оператора опишите их C++
Помогите выбрать компилятор С++ C++
Какой компилятор выбрать C++
Какой компилятор выбрать? C++
C++ сравнить два целых числа, не используя условного оператора, оператора выбора и так же символов сравнения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
26.06.2012, 16:21     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #2
у меня этот код выдает такую ошибку
main.cpp|12|error: 'klass klass::operator*(const int&, klass&)' must take either zero or one argument|
что неудивительно, как вы такой оператор использовать собираетесь?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
26.06.2012, 16:29  [ТС]     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #3
Цитата Сообщение от 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
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.06.2012, 16:38     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #4
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 () {};
};
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.06.2012, 18:20     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #5
Хм, интересное поведение. Мне компилятор сказал следующее:
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&)
В месте вызова для первого имеется два точных соответствия, для второго преобразование и точное соответствие, т.е. по идее компилятор должен считать первый вариант лучшим и вызывать именно его... Помогайте найти в стандарте соответствующий пункт))
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.06.2012, 18:45     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #6
Я сам тоже искал причину, но так до конца и не понял. 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&)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.06.2012, 18:50     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #7
Toshkarik, хм, мой gcc 4.7.1 говорит только о двух кандидатах - оба рукописные...
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.06.2012, 19:02     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #8
У меня MinGW на том же GCC 4.7.1.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.06.2012, 19:04     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #9
омг, у меня тоже мингв... А на какой код у вас эти сообщения выдаются?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.06.2012, 19:17     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #10
Вот на такой, скопировал как есть:

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;
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
26.06.2012, 19:20     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
error: 'someClass someClass::operator*(int, someClass&)' must take either zero or one argument
Это потому что метод получился .

Добавлено через 41 секунду
Цитата Сообщение от gray_fox Посмотреть сообщение
someClass::
это лишнее т.е.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.06.2012, 19:21     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #12
Да, это я уже подправил, мой косяк был.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.06.2012, 19:24     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #13
Toshkarik, и всё равно у меня только два кандидата... Но суть не в том, всё же интересно, почему компилятор не может разрешить перегрузку.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
26.06.2012, 19:26     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #14
Кстати, если main такой, то всё ок:
C++
1
2
3
int main () {
   klass() * klass();
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.06.2012, 19:27     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #15
А, стоп. Он может разрешить перегрузку. Я даже не заметил, что исполняемый файл создаётся, и что это только варнинг. Но всё же не понятно, откуда стандарт берёт неоднозначность при разрешении (видимо, gcc руководствуется дополнительными правилами в данном случае и всё-таки вывозит).
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.06.2012, 19:41     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #16
Я без -Werror компилирую и у меня именно ошибка получается.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.06.2012, 19:47     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #17
Toshkarik, да, с -pedantic действительно будет ошибка. Без него у меня исполняемый файл создаётся.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
26.06.2012, 19:47     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #18
Цитата Сообщение от Toshkarik Посмотреть сообщение
Я без -Werror компилирую и у меня именно ошибка получается.
-pedantic? У меня с -Wall только предупреждение (MinGW 4.7.0).
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.06.2012, 19:59     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #19
Да, с -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&)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2012, 22:25     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему?
Еще ссылки по теме:

Помогите выбрать компилятор C++
C++ Почему itog не выводится (нужный код в незаккоментированной части)
C++ Проверить есть ли в символьном массиве нужный элемент?

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2012, 22:25     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #20
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, то исчезнет.
Yandex
Объявления
27.06.2012, 22:25     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему?
Ответ Создать тему
Опции темы

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