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

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

Войти
Регистрация
Восстановить пароль
 
mariellla
0 / 0 / 0
Регистрация: 05.09.2016
Сообщений: 40
#1

приведение типов - C++

14.03.2017, 19:17. Просмотров 149. Ответов 3
Метки нет (Все метки)

Объясните, пожалуйста, почему возникает такая ошибка:
error C2666: 'operator *' : 4 overloads have similar conversions ?
Из-за того, что определены функции преобразования int и double?

stonewt1.h
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
#ifndef STONEWT1_H_
#define STONEWT1_H_
 
class Stonewt
{
private:
    enum {Lbs_per_stn = 14};
    int stone;
    double pds_left;
    double pounds;
 
public:
    Stonewt(double lbs);
    Stonewt(int stn, double lbs);
    Stonewt();
    ~Stonewt();
    void show_lbs() const;
    void show_stn() const;
 
    operator int() const;
    operator double() const;
    Stonewt operator+(double x);
 
    friend Stonewt operator*(double n, const Stonewt & );
    friend Stonewt operator*(const Stonewt &, const Stonewt &);
};
 
#endif
stonewt.cpp
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
#include <iostream>
#include "stonewt1.h"
using std::cout;
 
Stonewt::Stonewt(double lbs)
{   stone = int(lbs) / Lbs_per_stn;
    pds_left = int(lbs) % Lbs_per_stn + lbs - int(lbs);
    pounds = lbs;                                                         }
 
Stonewt::Stonewt(int stn, double lbs)
{   stone = stn;
    pds_left = lbs;
    pounds = stn * Lbs_per_stn + lbs;                             }
 
Stonewt::Stonewt()
{   stone = pounds = pds_left = 0;}
 
Stonewt::~Stonewt() {   }
 
void Stonewt::show_stn() const
{   cout << stone << " stone, " << pds_left << " pounds.\n";}
 
void Stonewt::show_lbs() const
{   cout << pounds << " pounds\n";}
 
Stonewt::operator int() const
{   return int(pounds + 0.5);}
 
Stonewt::operator double() const
{   return pounds;}
 
Stonewt Stonewt::operator+(double x)
{   return Stonewt(pounds + x);}
 
Stonewt operator*(double n, const Stonewt & st)
{   return Stonewt(n * st.pounds);}
 
Stonewt operator*(const Stonewt & st1, const Stonewt & st2)
{   return Stonewt(st1.pounds * st2.pounds);}
usestonewt1.cpp
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
#include <iostream>
#include "stonewt1.h"
using std::cout;
 
int main()
{
    double xD = 120;
    Stonewt xdSt = xD;
    cout << "\n\n\nstone = ";
    xdSt.show_stn();
    cout << "pounds = ";
    xdSt.show_lbs();
 
    Stonewt sSt(130);
    cout << "\n\n\nstone = ";
    sSt.show_stn();
    cout << "pounds = ";
    sSt.show_lbs();
 
    Stonewt multSt;
    multSt = sSt * double(xD);
    cout << "\n\n\nstone = ";
    multSt.show_stn();
    cout << "pounds = ";
    multSt.show_lbs();
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2017, 19:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос приведение типов (C++):

Приведение типов - C++
При вводе с клавиатуры s = 11 и a = 1.1, получаем 9. Результат переменной d = 10, это правильно. В чём подвох? int main() { ...

Приведение типов - C++
Как компилятор заставить адекватней приводить типы? (VS2012) Например: int a=-1; unsigned int b=5; if(a&gt;b){...}//Условие...

Приведение типов - C++
Делаю программу, которая кроме всего прочего должна отсортировать массив. Использую для этого qsort. Вот что получилось: ...

Приведение типов? - C++
Подскажите, пожалуйста что происходит. Не понимаю почему такой код работает. .h class Km { private: static const...

Приведение типов - C++
Необходимо привязать адрес массива double по указателю к адресу структуры. Массив сам создан в другом приложении. Если использовать...

Приведение типов - C++
Есть код вызова метода: obj.func(char a, char b) сам метод: void func(char a, char b) { int i = (int)a, int j = (int)b; В...

3
nmcf
5526 / 4836 / 1638
Регистрация: 14.04.2014
Сообщений: 19,633
14.03.2017, 19:59 #2
Ты слишком много всего добавил в класс. Преобразование типов неоднозначности даёт.
0
mariellla
0 / 0 / 0
Регистрация: 05.09.2016
Сообщений: 40
15.03.2017, 00:33  [ТС] #3
Цитата Сообщение от mariellla Посмотреть сообщение
operator int() const;
operator double() const;
Эти преобразования дают неоднозначности? или еще какие-то?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3945 / 2169 / 553
Регистрация: 18.10.2014
Сообщений: 3,783
15.03.2017, 03:53 #4
Цитата Сообщение от mariellla Посмотреть сообщение
Из-за того, что определены функции преобразования int и double?
... Или из-за того, что оператор умножения Stonewt на double не определен. Поэтому компилятор вынужден искать "обходные пути" выполнения умножения. А этих обходных путей он видит несколько и "лучшего" среди них нет.

Цитата Сообщение от mariellla Посмотреть сообщение
Эти преобразования дают неоднозначности? или еще какие-то?
Не задавайте бессмысленных вопросов. Когда в программе есть ошибка, не существует однозначного объяснения, почему именно она происходит. Это у вас надо спрашивать, что именно вы пытались сделать.

В данном случае невозможно ответить, что именно дает ваши "неоднозначности": слишком много операторов преобразования или слишком мало операторов умножения.
1
15.03.2017, 03:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2017, 03:53
Привет! Вот еще темы с ответами:

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

Приведение типов - C++
Доброго времени суток. Есть вопрос. Допустим: class Base { ..... } class Derived:public Base{ .... }

Приведение типов - C++
Как привести наследника ко второму родителю? class Parent1 { public: int a; int b; int c; }; class Parent2

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


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

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

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