Можно ли отключить мин, макс в STL? - PullRequest
1 голос
/ 10 июня 2010

Я использую одну библиотеку, которая очень важна и неприкасаема. Проблема в том, что библиотека объявляет функции min, max, поэтому, когда я включаю заголовок STL в проект, они конфликтуют. Я хочу отключить функцию min, max в STL (например, #define NOMNMAX), если смогу. Если я не могу, каково было бы решение?

Важно: Извините, это не макрос. Две функции являются шаблонными функциями.

как

template<T>
T min(const T& a, const T& b) { a < b ? a : b; }

Спасибо, заранее.

Ответы [ 6 ]

17 голосов
/ 10 июня 2010

Функции min и max определены в пространстве имен std, поэтому этот код не должен компилироваться:

#include <algorithm>

int main() {
    int n = min( 1, 2 );
}

Если это произойдет, ваша Стандартная библиотека несовместима.Кроме того, ваша важная и неприкасаемая библиотека должна объявлять свои функции в пространстве имен.Если это не так.громко пожаловаться продавцу.

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

using std::min;
using std::max;

, хотя авторы библиотеки чувствовали необходимость определить эти шаблоны, кто-то догадывается.

6 голосов
/ 10 июня 2010

Так как min и max (и все остальные стандартные члены библиотеки) определены в пространстве имен std, вы просто не должны импортировать это пространство имен, то есть не использовать using namespace std;.Вы все еще можете использовать STL путем явного разрешения пространства имен, например.std::max, std::cout и т. Д.

3 голосов
/ 10 июня 2010

Если ваша неприкасаемая библиотека не находится в пространстве имен, вы можете заставить поиск использовать глобальную область, а не std:

int i = ::min<int>(1,2);

Лучшим решением было бы удалить

using namespace std

и получите вашу библиотеку в пространстве имен.

2 голосов
/ 10 июня 2010

У меня иногда бывают проблемы с чем-то подобным, потому что iirc OpenCV # определяет свои собственные минимальные и максимальные значения, а также, как мне кажется, Windows.h.Обычно я помогаю себе просто:

#undef min
#undef max

Нейл прав, хотя min находится в пространстве имен std :: name.Для меня проблема заключается в том, что с некоторыми заголовками #defining min / max я даже не могу использовать std :: min ()

1 голос
/ 09 августа 2010

Определите NOMINMAX, и вы не получите ни одну из этих функций.

#define NOMINMAX
0 голосов
/ 10 июня 2010

Я предполагаю, что ваша библиотека определяет min / max как макросы, поэтому тот факт, что STL min / min находятся в пространстве имен, не поможет.Вы можете попробовать это:

#define max STL_MAX
#define min STL_MIN
#include <algorithm>
#undef min
#undef max

Таким образом, мин и макс переводятся во что-то другое, пока алгоритм компилируется.Конечно, это работает, только если вы включили алгоритм перед вашей библиотекой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...