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

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

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

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

26.06.2012, 16:06. Просмотров 1297. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Есть два перегруженныйх оператора *, но компилятор не может выбрать нужный, почему? (C++):

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

Почему компилятор жалуется на неправильное использование оператора ?: - C# WPF
Query = &quot;INSERT INTO Transport (IsIn) VALUES('&quot; + Convert.ToBoolean(this.IsInCheckBox.IsChecked) ? '1' : '0'; +&quot;') Пользуюсь ?: так...

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.06.2012, 19:41 #16
Я без -Werror компилирую и у меня именно ошибка получается.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
26.06.2012, 19:47 #17
Toshkarik, да, с -pedantic действительно будет ошибка. Без него у меня исполняемый файл создаётся.
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
26.06.2012, 19:47 #18
Цитата Сообщение от Toshkarik Посмотреть сообщение
Я без -Werror компилирую и у меня именно ошибка получается.
-pedantic? У меня с -Wall только предупреждение (MinGW 4.7.0).
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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&)
0
alsav22
5419 / 4815 / 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, то исчезнет.
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,001
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
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.06.2012, 07:28 #22
grizlik78, да, что-то забыл я, что преобразование из не-const в const тоже учитывается при разрешении перегрузки...
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,001
28.06.2012, 11:35 #24
Ну мало ли. Может неявное преобразование к float желательно. А вот делать правый аргумент у этих функций разным большого смысла не вижу.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 11:35
Привет! Вот еще темы с ответами:

Почему меши (сетки, 3д модели) так долго загружаються, может там есть какие то ньюансы? - DirectX
В общем моделей совсем немного (по сравнению с обычным уровнем в любой игре) а загружаються они дольше чем уровень в какой либо игре (NFS,...

Есть два одинаковых по действию кода, но мкопилятор к ним относится по разному, почему? - Delphi
Друзья! Есть такой код: function f(ch : char) : Boolean; begin if (ch&lt;&gt;'0') then IsFloat := True; IsFloat := True; ...

Выбрать нужный параграф - PHP
Добрый день! Подскажите как выбрать нужный параграф из HTML страницы. В нужном параграфе есть текст XXX /&lt;p.*?XXX.*?p&gt;/s -...

Выбрать нужный элемент - jQuery
Доброе время суток, не могу понять как задать селектор, чтоб выбрать нужный мне элемент К примеру есть html код &lt;div...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.06.2012, 11:35
Ответ Создать тему
Опции темы

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