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

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

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

Author24 — интернет-сервис помощи студентам
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) ?...

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

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

23
Эксперт С++
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
28.06.2012, 01:05 21
Лучший ответ Сообщение было отмечено как решение

Решение

Author24 — интернет-сервис помощи студентам
Итак, у нас есть функция член
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
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
28.06.2012, 07:28 22
grizlik78, да, что-то забыл я, что преобразование из не-const в const тоже учитывается при разрешении перегрузки...
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
Эксперт С++
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
28.06.2012, 11:35 24
Ну мало ли. Может неявное преобразование к float желательно. А вот делать правый аргумент у этих функций разным большого смысла не вижу.
0
28.06.2012, 11:35
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.06.2012, 11:35
Помогаю со студенческими работами здесь

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

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

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

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

Есть данная БД. Нужно написать два запроса на SQL. Может ли кто-то подсказать?
Запросы и сама БД приведены в рисунках ниже. Спасибо.

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


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Как работать с ветками (branch) в Git
InfoMaster 17.01.2025
Система контроля версий Git произвела революцию в процессе разработки программного обеспечения, предоставив разработчикам мощный инструмент для управления изменениями в коде. Одной из наиболее важных. . .
Как откатить последние коммиты в Git
InfoMaster 17.01.2025
Система контроля версий Git стала неотъемлемой частью современной разработки программного обеспечения, предоставляя разработчикам мощные инструменты для управления изменениями в коде. Одним из. . .
Что такое boilerplate и scaffold, чем они отличаются
InfoMaster 17.01.2025
В современном мире разработки программного обеспечения эффективность и скорость создания качественного кода играют crucial роль в успехе проектов. Разработчики постоянно ищут способы оптимизировать. . .
Чем отличаются ссылки и указатели в С++
InfoMaster 17.01.2025
В современном программировании на C++ эффективная работа с памятью является ключевым аспектом разработки качественного программного обеспечения. Указатели и ссылки представляют собой два. . .
В чем разница между PUT и POST
InfoMaster 17.01.2025
В современной веб-разработке правильное использование HTTP-методов играет ключевую роль в создании надежных и эффективных API-интерфейсов. Протокол HTTP прошел долгий путь развития с момента своего. . .
DTO, POCO и Value Object: что это такое, когда и как использовать
InfoMaster 17.01.2025
Введение в паттерны передачи данных В современной разработке программного обеспечения эффективное управление данными и их передача между различными слоями приложения являются ключевыми аспектами. . .
Что такое pull request в Git
InfoMaster 17.01.2025
В современной разработке программного обеспечения pull request в Git представляет собой ключевой механизм для эффективного взаимодействия между разработчиками при работе над общим кодом проекта. По. . .
Как вернуться к предыдущему коммиту в Git
InfoMaster 17.01.2025
Система контроля версий Git представляет собой мощный инструмент для управления изменениями в программном коде, который позволяет разработчикам эффективно отслеживать и контролировать историю. . .
Что такое паттерны программировани­я и проектирования
InfoMaster 17.01.2025
Роль паттернов в современной разработке программного обеспечения В современном мире разработки программного обеспечения паттерны проектирования стали неотъемлемой частью профессионального подхода. . .
Как добавить конструктор Яндекс Карт на сайт
InfoMaster 17.01.2025
Введение в API Яндекс Карт В современной веб-разработке интеграция картографических сервисов стала неотъемлемой частью многих проектов. API Яндекс Карт представляет собой мощный инструмент для. . .
Что такое javascript:void­­(0) и зачем это нужно
InfoMaster 17.01.2025
Когда вы сталкиваетесь с веб-разработкой, особенно с использованием JavaScript, одной из директив, которая часто встречается, является javascript:void(0). Это выражение вызывает интерес из-за своей. . .
Что такое оркестрация и хореография микросервисов
InfoMaster 17.01.2025
Введение в оркестрацию и хореографию микросервисов В современном мире разработки программного обеспечения микросервисная архитектура стала ключевым подходом к созданию масштабируемых и гибких. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru