Я пытаюсь скомпилировать какой-то старый код 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>
заголовок.
Мои два вопроса:
На линии 685 в bits/stl_bvector.h
у тебя есть :
__gnu_cxx::__numeric_traits<difference_type>::__max
Ваш уродливый макрос заменяет __max
от max
отсюда и ошибка.
Вы можете эффективно заменить все свои __max
в вашем коде std::max
, но чтобы не разбирать все, сначала можно переименовать __max
от __my__max
Просто чтобы быть уверенным (в вашем макросе тоже). Таким образом, вы будете продолжать использовать самостоятельно определенные функции min / max.
Другое решение было бы undef
Ваш макрос перед включением заголовков stl и включением его после.
Других решений пока нет …