макрос "max" требует 2 аргумента, но только 1 - PullRequest
4 голосов
/ 06 февраля 2009
template <class T>
struct scalar_log_minimum {
public:
    typedef T value_type;
    typedef T result_type;
    static
        result_type initial_value(){
            return std::log(std::numeric_limits<result_type>::max());
    }
    static
        void update(result_type& t, const value_type& x){
            if ( (x>0) && (std::log(x)<t) ) t = std::log(x);
    }
};

Я получил следующую ошибку при попытке скомпилировать выше:

functions_ext.hpp: 55: 59: макросу "max" требуется 2 аргумента, но только 1 дан

Макс не макрос, верно? Тогда что это за ошибка? Кстати, я использую Visual Studio 2005

И что такое 55:59 --- 55 - это номер строки 59?

Ответы [ 4 ]

7 голосов
/ 06 февраля 2009

Вы включаете заголовочный файл где-то, что #define s max как макрос Лучшим решением было бы выяснить, где оно определяется, и запретить его определение, если это возможно. Кроме того, вы можете просто #undef это:

#include <evil_header_which_defines_max.h>
#undef max
5 голосов
/ 06 февраля 2009

Я нахожу много #defines, с которыми вы сталкиваетесь, когда включаете windows.h, очень тревожно (не только max и min, но у меня также были проблемы с другими общими словами, такими как Rectangle, если я не ошибаюсь). Поэтому я выработал привычку включать windows.h только в случае крайней необходимости, а не в заголовочные файлы. Это уменьшает боль от небольшого количества файлов C ++, которые зависят от платформы.

К сожалению, некоторые библиотеки повышения (я считаю, что thread и asio) включают в свои заголовки windows.h, и время от времени я все еще сталкиваюсь с такими глупыми проблемами.

Мое решение для остальных ситуаций, в которых это вызывает проблемы, состоит в том, чтобы #undef проблемных символов после включения заголовочных файлов.

3 голосов
/ 06 февраля 2009

Как уже отмечали другие, в том числе windows.h, вероятно, ваша проблема. Microsoft предоставляет средства для «отключения» частей windows.h с помощью символов препроцессора. Вы можете определить эти символы как часть вашей сборки или непосредственно в коде.

Использование символов препроцессора для условного пропуска секций windows.h может или не может считаться элегантным, но в общем случае это более простое, более общее и более масштабируемое решение, чем #undef.

Вот как пропустить определение min или max как макроса:

#define NOMINMAX
#include <windows.h>

Обратите внимание, что многие включаемые файлы в какой-то момент будут включать windows.h. В таких случаях настройка ваших определений на более глобальном уровне может быть более удобной.

Если вы ищете через windows.h, вы можете найти множество других символов препроцессора (например, NOOPENFILE, NOKANJI, NOKERNEL и многие другие), которые часто могут быть полезны.

1 голос
/ 06 февраля 2009

Это макрос под названием max, который, как объяснил Адам, мешает. Другое решение (скорее «исправление») может заключаться в том, чтобы заключить функцию в скобки, чтобы она не рассматривалась как вызов макроса:

return std::log((std::numeric_limits<result_type>::max)());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...