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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,420
#1

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

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

Почему itog не выводится (нужный код в незаккоментированной части) - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; int main() { char str,itog,poditog=&quot;&quot;;int chet,size; ...

Какой компилятор выбрать - C++
Пишу диплом... Мне надо в документации указать почему я выбрал именно язык с++, почему среда разработки QT Creator и почему компилятор Min...

Помогите выбрать компилятор С++ - C++
Всем Привет. Неделю назад я озадачился изучением С++. Читая книгу естественно намного лучше запоминать коды сразу печатая их. я вот...

Помогите выбрать компилятор - C++
Привет, я начинающий программист в C++ Хочу попросить у вас помощи, может быть для вас вопрос будет смешной. Помогите выбрать...

Проверить есть ли в символьном массиве нужный элемент? - C++
Проверить есть ли в символьном массиве нужный элемент? char cell = { '-', '-', '-', '-', '-', '-', '-', '-', '-'}; char move;...

Какой компилятор лучше выбрать для проганья на C++? - C++
Добрый день господа,очень хочу попросить совета профессионалов. Учусь программированию на С++,С,но столкнулся с дилеммой,что выбрать к...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
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
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.06.2012, 07:28     Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? #22
grizlik78, да, что-то забыл я, что преобразование из не-const в const тоже учитывается при разрешении перегрузки...
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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++
#include &lt;iostream&gt; using namespace std; int main() { int a; cin.get(a); system(&quot;pause&quot;); }

Почему компилятор ругается? - C++
#include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;conio.h&gt; using namespace std; FILE*fp; struct Computer { char...

Почему компилятор выдает ошибку? - C++
#include &lt;stdio.h&gt; #include &lt;clocale&gt; typedef enum{ COUNT, POUNDS, PINTS }unit_of_measure; typedef union{ short count;...

Почему компилятор выдаёт ошибки? - C++
Почему компилятор выдаёт ошибки? #include &lt;iostream.h&gt; #include &lt;conio.h&gt; Void main () { int a, b, c; std::cin &gt;&gt; a &gt;&gt; b...


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

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

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