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

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

Войти
Регистрация
Восстановить пароль
 
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 159
#1

#error - C++

25.07.2013, 22:43. Просмотров 567. Ответов 18
Метки нет (Все метки)

Добрый вечер!
При сравнении объектов разных типов, должна вылетать ошибка компиляции. А ошибка получается здесь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#define RIGHT
 
bool approx :: operator> (const approx& obj) const //перегруженный оператор сравнения объектов >
{
    if ( (this -> type != true) || (obj.type != true) )
        #undef RIGHT
    
    #ifndef RIGHT
    #error "Types of the values are different"
    #endif
 
    return (this -> value) > obj.value;
}
В чем дело, не подскажете?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
25.07.2013, 22:47     #error #2
Команды препроцессора работают на этапе компоновки, а на этапе выполнения программы.
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,950
Записей в блоге: 2
Завершенные тесты: 1
25.07.2013, 22:47     #error #3
C++
1
2
3
4
5
6
7
8
    if ( (this -> type != true) || (obj.type != true) )
        #undef RIGHT
    
    #ifndef RIGHT
    #error "Types of the values are different"
    #endif
 
    return (this -> value) > obj.value;
почитайте про препроцессор!!!
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 159
25.07.2013, 22:50  [ТС]     #error #4
Цитата Сообщение от Croessmah Посмотреть сообщение
почитайте про препроцессор!!!
Пойду перечитывать)

А все таки, как запретить компиляцию кода?
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
25.07.2013, 22:52     #error #5
Цитата Сообщение от Ryabchik Посмотреть сообщение
как запретить компиляцию кода
Также как делали вы. Только if - оператор который работает во время выполнения программы, а не во время компиляции.
C++
1
2
3
#if ...
#error ....
#endif
Так будет работать
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 159
25.07.2013, 22:56  [ТС]     #error #6
C++
1
2
3
#if !defined (RIGHT)
    #error "Types of the values are different"
    #endif
Так?
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
25.07.2013, 22:58     #error #7
Да, будет ошибка, если не определен RIGHT. Только не думаю, что вам это поможет. Потому что RIGHT определяется тоже во время компиляции, а не во время выполнения. Во время выполнения RIGHT - константа.
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 159
25.07.2013, 22:59  [ТС]     #error #8
Цитата Сообщение от gooseim Посмотреть сообщение
Да, будет ошибка, если не определен RIGHT
У меня так же ошибка, как первоначально
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
25.07.2013, 23:00     #error #9
Цитата Сообщение от Ryabchik Посмотреть сообщение
У меня так же ошибка, как первоначально
Про это я и говорю. Это вам не поможет.

Добавлено через 19 секунд
Синтаксически правильно, эффекта нет.
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 159
25.07.2013, 23:00  [ТС]     #error #10
Цитата Сообщение от gooseim Посмотреть сообщение
Это вам не поможет.
А что мне поможет? Цианид не предлагать)
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
25.07.2013, 23:01     #error #11
C++
1
2
3
4
5
6
7
bool approx :: operator> (const approx& obj) const //перегруженный оператор сравнения объектов >
{
    if ( (this -> type != true) || (obj.type != true) )
        throw "Types of the values are different";
    
    return (this -> value) > obj.value;
}
Как вариант.
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,950
Записей в блоге: 2
Завершенные тесты: 1
25.07.2013, 23:01     #error #12
Цитата Сообщение от Ryabchik Посмотреть сообщение
А что мне поможет?
Любой учебник!
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2013, 23:01     #error #13
Цитата Сообщение от gooseim Посмотреть сообщение
Команды препроцессора работают на этапе компоновки, а на этапе выполнения программы.
0_о...
компановка выполняется компановщиком он же линкер, какой препроцессор на этапе компановки?
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 159
25.07.2013, 23:01  [ТС]     #error #14
Поясню: если сравниваются объекты разных типов, это бессмысленно, но как это запретить?
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2013, 23:03     #error #15
Ryabchik, запретить когда? на этапе компиляции? в runtime? какие другие типы могут попасть в сравнение?
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
25.07.2013, 23:04     #error #16
Jupiter, простите, погорячился. На этапе прекомпиляции.
Так устроит?
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 159
25.07.2013, 23:07  [ТС]     #error #17
Jupiter,
На этапе компиляции.
Это реализация "примерного типа данных". Если type - true, значение - точное, если false - примерное.
Сравнивать примерное с точным не нужно.
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2013, 23:29     #error #18
ну так шаблоны вам в помощь...
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>
 
template<bool isStrict>
struct data_type
{
    int foo;
    
    data_type(int foo) : foo(foo) {}
};
 
bool operator < (const data_type<true>& a, const data_type<true>& b)
{
    return a.foo < b.foo;
}
 
typedef data_type<true> strict_data_type;
typedef data_type<false> non_strict_data_type;
 
int main()
{
    strict_data_type a(10), b(20);
    non_strict_data_type c(10), d(20);
    
    std::cout << (a < b);
    std::cout << (c < d); //error
   
   return 0;
}
по возможности можно ещё и static_assert воткнуть для более вразумительного сообщения об ошибке

Не по теме:

Цитата Сообщение от gooseim Посмотреть сообщение
Так устроит?
угу

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2013, 00:07     #error
Еще ссылки по теме:

C++ [ILINK32 Error] Error: Unresolved external
C++ Ошибка: error: 'error' was not declared in this scope
Error C2061: syntax error : identifier 'h' C++
Ошибки fatal error U1052 и error MSB3073 C++
Проверить правильность кода. Вылезает Error 5 error C2679: binary '<<' : no operator found which takes a right C++

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

Или воспользуйтесь поиском по форуму:
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 159
26.07.2013, 00:07  [ТС]     #error #19
Jupiter, спасибо за помощь
Yandex
Объявления
26.07.2013, 00:07     #error
Ответ Создать тему
Опции темы

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