Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
1

Конфликт типов (int, double, bool)

17.05.2015, 13:56. Просмотров 1073. Ответов 3
Метки нет (Все метки)

Есть простейший класс
C++
1
2
3
4
5
6
class A {
public:
    A( long ) {}
    A( double ){}
    A( bool ) {}
}
и при создании обьекта
C++
1
new A(123);
компилятор очевидно ругается

Код
error: call of overloaded 'A(int)' is ambiguous
note: candidates are:
note: A::A(bool)
note: A::A(double)
note: A::A(long int)
Например для меня очевидно что если число без дробной части (123) то это int, если с дробной (123.1) то double, а константы (true, false) это bool, но компилятор думает иначе, и как быть в таком случае? Можно как-то указать конструктору какой именно тип используется? (Без темплейтов)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2015, 13:56
Ответы с готовыми решениями:

Некорректное преобразование double в int (приведение типов)
Не совсем очевидно. https://ideone.com/7P0EhY #include <iostream>...

Создать перегружаемые функции и шаблоны для типов int и double
Создать перегружаемые функции и шаблоны для типов int и double. Передачу ...

Преобразование типов double в int для задания размерности массива
Объясните, пожалуйста. Не объявляется массив, хотя его размеры объявил как...

Неверный результат при преобразования типов данных static_cast<int>(double)
Доброго времени суток, уважаемые программисты! Перейду сразу к сути проблемы:...

Используя перегрузки, написать функцию для выполнения действий, для следующих типов данных: float, int, double
Используя перегрузки, написать функцию для выполнения действий, для следующих...

3
hoggy
Заблокирован
Эксперт С++
17.05.2015, 14:44 2
Лучший ответ Сообщение было отмечено OrmaJever как решение

Решение

Цитата Сообщение от OrmaJever Посмотреть сообщение
Например для меня очевидно что если число без дробной части (123) то это int, если с дробной (123.1) то double, а константы (true, false) это bool, но компилятор думает иначе, и как быть в таком случае? Можно как-то указать конструктору какой именно тип используется? (Без темплейтов)
у вас нет конструктора, который принимает int.

C++
1
2
3
4
5
6
7
8
9
10
11
class A {
public:
   // ни один из контрукторов не принимает int
   // требуется приведение. 
   // компилятор может привести int и к long, и к double, и к bool
   // и к чему приводить?
   // думаете компилятор - телепат?
    A( long ) {}
    A( double ){}
    A( bool ) {}
}
http://rextester.com/LEEQ74220

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//g++  4.9.1
 
#include <iostream>
#include <cstdint>
 
 
class A
{
public:
    
    A(bool)   { std::cout<<"ctor: bool\n"; }
    A(double) { std::cout<<"ctor: double\n"; }
    
    template<typename T, 
        typename std::enable_if<std::is_integral<T>::value>::type* = nullptr 
    >
    A(T) 
    {
        static_assert( 
            std::is_same<T,  int8_t>::value  ||
            std::is_same<T, int16_t>::value  ||
            std::is_same<T, int32_t>::value  ||
            std::is_same<T, int64_t>::value  ||
            std::is_same<T,  uint8_t>::value ||
            std::is_same<T, uint16_t>::value ||
            std::is_same<T, uint32_t>::value ||
            std::is_same<T, uint64_t>::value ,
            "ERROR: parametr construct class A must be bool, double, or underlying type is int"
        );
        
        std::cout<<"ctor: underlying type int\n";
    }
    
    template<typename T, 
        typename std::enable_if<std::is_same<T, float>::value>::type* = nullptr
    >
    A(T) 
    {
        static_assert( 
            !std::is_same<T,float>::value,
            "ERROR: class A do not support float. use double"
        );
    }
    
};
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    // for bool
    new A(true);
    
    // for double
    new A(123.5);
    
    // for underlying type int
    new A(123);
    new A(uint64_t(123) );
}
1
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
17.05.2015, 14:49  [ТС] 3
hoggy, а ведь вы правы! Мне почему-то казалось что long заменит int
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
17.05.2015, 15:27 4
C++
1
new A( 123L );
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2015, 15:27

Преобразовать 2 числа int в 1 число float(double) | double int1.int2
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения...

Преобразование double в bool
Не удаётся сделать следующее, есть входные данные к примеру 0.5 или 1 float ,...

Определение типов. Приведение int к unsigned int
При таком определении 5 рассматривается как int. Как при определении указать...


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

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

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