linux — минимальное и максимальное в устаревшем переполнении стека

Я пытаюсь скомпилировать какой-то старый код C ++ (вероятно, примерно с 2001-2002 гг.) В стабильной системе Debian GNU / Linux. При компиляции я получаю ошибку:

In file included from /usr/include/c++/4.7/vector:66:0,
from ../FooMath/FooBar.h:23,
from FooBar.cpp:2:
/usr/include/c++/4.7/bits/stl_bvector.h: In member function ‘std::vector<bool, _Alloc>::size_type std::vector<bool, _Alloc>::max_size() const’:
/usr/include/c++/4.7/bits/stl_bvector.h:685:2: error: ‘max’ is not a member of ‘__gnu_cxx::__numeric_traits<long int>’

Разыскивая проблему, я наткнулся на этот фрагмент кода в одном из наших собственных заголовочных файлов, который, как я полагаю, связан с этой проблемой:

#if defined(IRIX) | linux
signed  max(signed a, signed b);
long    max(long a, long b);
double  max(double a, double b);
float   max(float a, float b);
signed  min(signed a, signed b);
long    min(long a, long b);
double  min(double a, double b);
#define  __min min
#define  __max max
float   min(float a, float b);
#endif

и во многих других местах, я вижу призывы к __max() функция с двумя аргументами.

Мое обоснованное предположение, что я могу заменить все эти звонки __max() с звонками в std::max() и что я должен включить <algorithm> заголовок.

Мои два вопроса:

  1. Правильно ли мое образованное предположение?
  2. Я предполагаю, что дополнительные объявления и определения min и max являются историческим остатком. Кто-нибудь знает историю этого? Зачем этот код когда-либо был нужен?

2

Решение

На линии 685 в bits/stl_bvector.h у тебя есть :

    __gnu_cxx::__numeric_traits<difference_type>::__max

Ваш уродливый макрос заменяет __max от maxотсюда и ошибка.

Вы можете эффективно заменить все свои __max в вашем коде std::max, но чтобы не разбирать все, сначала можно переименовать __max от __my__maxПросто чтобы быть уверенным (в вашем макросе тоже). Таким образом, вы будете продолжать использовать самостоятельно определенные функции min / max.


Другое решение было бы undef Ваш макрос перед включением заголовков stl и включением его после.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector