Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
mariellla
0 / 0 / 1
Регистрация: 05.09.2016
Сообщений: 42
1

приведение типов

14.03.2017, 19:17. Просмотров 205. Ответов 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
Ответы с готовыми решениями:

Приведение типов
В чем различие привидения типа (type)expression, от type(expression)?

Приведение типов
Всем привет) Есть массив int a = {2 ,4 ,5 ,6 ,256} Числа располагаются по...

Приведение типов
Привет всем! Компилятор выдает варнинг если сравниваются signed и unsigned...

Приведение типов.
Доброго времени суток! В общем, есть класс Matrix(прямоугольные над полем...

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

3
nmcf
6277 / 5578 / 2539
Регистрация: 14.04.2014
Сообщений: 23,471
14.03.2017, 19:59 2
Ты слишком много всего добавил в класс. Преобразование типов неоднозначности даёт.
0
mariellla
0 / 0 / 1
Регистрация: 05.09.2016
Сообщений: 42
15.03.2017, 00:33  [ТС] 3
Цитата Сообщение от mariellla Посмотреть сообщение
operator int() const;
operator double() const;
Эти преобразования дают неоднозначности? или еще какие-то?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4772 / 2429 / 679
Регистрация: 18.10.2014
Сообщений: 4,150
15.03.2017, 03:53 4
Цитата Сообщение от mariellla Посмотреть сообщение
Из-за того, что определены функции преобразования int и double?
... Или из-за того, что оператор умножения Stonewt на double не определен. Поэтому компилятор вынужден искать "обходные пути" выполнения умножения. А этих обходных путей он видит несколько и "лучшего" среди них нет.

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

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

Приведение типов
Как привести наследника ко второму родителю? class Parent1 { public: ...

Приведение типов
Как компилятор заставить адекватней приводить типы? (VS2012) Например: int...

Приведение типов
Необходимо привязать адрес массива double по указателю к адресу структуры....


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

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

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