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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
26.06.2012, 16:21 #2
у меня этот код выдает такую ошибку
main.cpp|12|error: 'klass klass::operator*(const int&, klass&)' must take either zero or one argument|
что неудивительно, как вы такой оператор использовать собираетесь?
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
26.06.2012, 16:29  [ТС] #3
Цитата Сообщение от defer Посмотреть сообщение
у меня этот код выдает такую ошибку
main.cpp|12|error: 'klass klass::operator*(const int&, klass&)' must take either zero or one argument|
что неудивительно, как вы такой оператор использовать собираетесь?
Это неважно. Такой оператор я использовать не буду. Код упрощён, я же говорю, пример демонстрационый. Чуть-чуть усложните чтобы ваш компилятор не выдавал этой ошибки и всё. Впрочем, вот:
C++
1
friend klass operator*(const int &chislo, klass &fr) {return klass (chislo);};
Так, думаю, пойдёт. У меня g++ 4.6.1
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.06.2012, 16:38 #4
C++
1
friend klass operator*(const int &chislo, const klass &fr) {return klass(chislo);};
Добавлено через 1 минуту
То есть вот так вот все должно работать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class klass {
public:
 klass() {}
 klass(int n) {}
 klass operator*(const klass &other){}
    
 //Сейчас всё компилится, но если расскоментить эту строку, то
 //компилиться не будет                                       
 
 friend klass operator*(const int &chislo, const klass &fr) {};   
    
 operator float () {};
};
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
26.06.2012, 18:20 #5
Хм, интересное поведение. Мне компилятор сказал следующее:
ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second
Если добавить ко второму параметру friend-оператора квалификатор const, всё скомпилируется. Если убрать конвертер double - тоже. При этом вроде бы имеется два оператора:
klass operator*(const klass&, const class&)
и
klass operator*(const int&, klass&)
В месте вызова для первого имеется два точных соответствия, для второго преобразование и точное соответствие, т.е. по идее компилятор должен считать первый вариант лучшим и вызывать именно его... Помогайте найти в стандарте соответствующий пункт))
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.06.2012, 18:45 #6
Я сам тоже искал причину, но так до конца и не понял. GCC при этом пишет еще и о неком встроенном операторе operator*(float, float):
main.cpp:32:18: error: ambiguous overload for 'operator*' in 'h * h_'
main.cpp:32:18: note: candidates are:
main.cpp:32:18: note: operator*(float, float) <built-in>
main.cpp:19:8: note: klass klass::operator*(const klass&)
main.cpp:24:15: note: klass operator*(const int&, klass&)
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
26.06.2012, 18:50 #7
Toshkarik, хм, мой gcc 4.7.1 говорит только о двух кандидатах - оба рукописные...
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.06.2012, 19:02 #8
У меня MinGW на том же GCC 4.7.1.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
26.06.2012, 19:04 #9
омг, у меня тоже мингв... А на какой код у вас эти сообщения выдаются?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.06.2012, 19:17 #10
Вот на такой, скопировал как есть:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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_ );
   
 return 0;
}
Добавлено через 3 минуты
Немного отформатировал пример, что бы было понятнее:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class someClass {
   friend someClass operator*( const int , someClass & );
   
 public:
   someClass();
   someClass( int );
   
   someClass operator*( const someClass & );
   
   operator float ();
   
 private:
   int x;
};
 
someClass::someClass()
   : x( 0 )
{
   
}
 
someClass::someClass( int n )
   : x( n )
{
   
}
 
someClass someClass::operator*( someClass &other ) {
   
}
 
someClass operator*( const int number, someClass &fr ) {
   
}
 
someClass::operator float () {
   return .0;
}
 
int main () {
 someClass h( 7 );
 someClass h_( 5 );
 someClass h__( h * h_ );
   
 return 0;
}
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
26.06.2012, 19:20 #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
error: 'someClass someClass::operator*(int, someClass&)' must take either zero or one argument
Это потому что метод получился .

Добавлено через 41 секунду
Цитата Сообщение от gray_fox Посмотреть сообщение
someClass::
это лишнее т.е.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.06.2012, 19:21 #12
Да, это я уже подправил, мой косяк был.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
26.06.2012, 19:24 #13
Toshkarik, и всё равно у меня только два кандидата... Но суть не в том, всё же интересно, почему компилятор не может разрешить перегрузку.
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
26.06.2012, 19:26 #14
Кстати, если main такой, то всё ок:
C++
1
2
3
int main () {
   klass() * klass();
}
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
26.06.2012, 19:27 #15
А, стоп. Он может разрешить перегрузку. Я даже не заметил, что исполняемый файл создаётся, и что это только варнинг. Но всё же не понятно, откуда стандарт берёт неоднозначность при разрешении (видимо, gcc руководствуется дополнительными правилами в данном случае и всё-таки вывозит).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2012, 19:27
Привет! Вот еще темы с ответами:

Почему меши (сетки, 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
Объявления
26.06.2012, 19:27
Ответ Создать тему
Опции темы

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