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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
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++ сравнить два целых числа, не используя условного оператора, оператора выбора и так же символов сравнения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
28.06.2012, 01:05     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #21
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Итак, у нас есть функция член
C++
1
someClass operator*( const someClass & );
и глобальная функция
C++
1
someClass operator*( const int number, someClass &fr );
При вызове h * h_ возникает неоднозначность. Вопрос — почему?

Всё довольно просто.
Чтобы вызвать первую функцию первый аргумент подходит идеально, а для второго надо сделать преобразование
someClass & => someClass const&
Чтобы вызвать вторую функцию, наоборот, идеально подходит второй аргумент, а для первого надо выполнить преобразование
someClass => float => int
То есть для первой функции лучше подходит первый аргумент, а для второй — второй. Это и вызывает неоднозначность.

Что делать?
Чтобы устранить неоднозначность надо второй аргумент сделать одинаковым. То есть либо в глобальной функции сделать ссылку ссылкой на константу, либо в функции-члене убрать const или вовсе использовать передачу второго аргумента по значению.

Цитата Сообщение от alsav22 Посмотреть сообщение
Если объявить h_ как const, то исчезнет.
Да, в этом случае для функции-члена оба аргумента подходят лучше, чем для глобальной функции.

Добавлено через 5 минут
Цитата Сообщение от silent_1991 Посмотреть сообщение
Помогайте найти в стандарте соответствующий пункт))
Что-то похожее на описанное мной есть в 13.3.3.3 стандарта C++03.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.06.2012, 07:28     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #22
grizlik78, да, что-то забыл я, что преобразование из не-const в const тоже учитывается при разрешении перегрузки...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.06.2012, 11:30     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #23
C++11 легко решает эту проблемку.

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) {};   
    
 explicit operator float () {};
};
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
int main () {
 klass h (7);
 klass h_ (5);
 klass h__ (h* h_);
 getchar ();
 return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 11:35     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
28.06.2012, 11:35     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #24
Ну мало ли. Может неявное преобразование к float желательно. А вот делать правый аргумент у этих функций разным большого смысла не вижу.
Yandex
Объявления
28.06.2012, 11:35     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему?
Ответ Создать тему
Опции темы

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