Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
1

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

26.06.2012, 16:06. Просмотров 1395. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2012, 16:06
Ответы с готовыми решениями:

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

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

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

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

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

23
grizlik78
Эксперт С++
1987 / 1480 / 191
Регистрация: 29.05.2011
Сообщений: 3,059
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.
3
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
28.06.2012, 07:28 22
grizlik78, да, что-то забыл я, что преобразование из не-const в const тоже учитывается при разрешении перегрузки...
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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;
}
2
grizlik78
Эксперт С++
1987 / 1480 / 191
Регистрация: 29.05.2011
Сообщений: 3,059
28.06.2012, 11:35 24
Ну мало ли. Может неявное преобразование к float желательно. А вот делать правый аргумент у этих функций разным большого смысла не вижу.
0
28.06.2012, 11:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 11:35

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

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

Алгоритм Петерсона: почему поток не может два раза подряд выполнить критическую секцию?
Друзья! Имеем два потока. Читаем: &quot;Не должно возникать неограниченно...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru