Nano Hash - криптовалюты, майнинг, программирование

«numeric_limits» не был объявлен в этой области, нет соответствующей функции для вызова «max()»

Я скомпилировал этот код дома на своем Mac с xcode, и проблем не было. Я компилирую его в школе с помощью g++ в Linux и получаю следующие ошибки:

numeric_limits’ не является членом std

ожидаемое основное выражение перед токеном «›»

нет соответствующей функции для вызова «max()»

    #include <iostream>
    #include <cstdlib>

    using namespace std;

    int GetIntegerInput(int lower, int upper)
    {
        int integer = -1;
        do
        {    
            cin >> integer;
            cin.clear();
            cin.ignore(std::numeric_limits<streamsize>::max(), '\n');  //errors here
        } while (integer < lower || integer > upper);
    
        return integer;    
    } 

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

numeric_limits не был объявлен в этой области


  • Когда вы читали документацию по numeric_limits, чтобы узнать, как его использовать, разве там не говорилось, в каком заголовке он находится? 26.01.2011
  • да, но это было давно, а потом я совсем недавно скопировал код из своего другого проекта, сам того не осознавая. 27.01.2011
  • добавить #include <limits> 28.03.2021

Ответы:


1

Вам нужно включить заголовочный файл <limits>, в котором определяется std::numeric_limits. Ваш компилятор Mac помог вам, автоматически включив этот заголовочный файл; однако вы не должны полагаться на такое поведение и явно включать любые файлы заголовков, которые вам нужны.

25.01.2011
  • У этой функции есть название? Я хочу выяснить, как отключить его, чтобы не нарушать независимость от платформы. 04.12.2015

  • 2

    GCC 11 начал явно требовать включения <limits>, <memory>, <utility>, <thread> согласно https://www.gnu.org/software/gcc/gcc-11/porting_to.html#header-dep-changes

    Такая же или похожая история с Clang 12 (или раньше, не знаю).

    Поскольку я встречаю эту ошибку (часто) при использовании yarn (менеджер пакетов для Node.js), и он каждый раз перезаписывает все исходные файлы, я не могу легко добавить #include <limits>: мне нужно либо разветвить, либо спамить cp /tmp/fixedBad.h /installdir/bad.h, пока идет компиляция.

    Поэтому мое решение состоит в том, чтобы добавить в CXXFLAGS (не CFLAGS) следующее:

    -include /usr/include/c++/11/limits (Ubuntu 21.04, gcc 11.1.0)

    -include /usr/include/c++/11.1.0/limits (Arch Linux; та же версия, но путь отличается от Debian/Ubuntu)

    или элегантно: -include /usr/include/c++/11*/limits (* работает из-за оболочки/make, а не из-за gcc/clang, поэтому будьте осторожны, если вы напрямую передаете аргументы в gcc/clang, например, из программы на C)

    У меня это в /etc/environment

    #CPPFLAGS="-D_FORTIFY_SOURCE=2 -DNDEBUG"
    CPPFLAGS="-D_FORTIFY_SOURCE=2"
    CFLAGS="-g -pipe -march=native -mtune=native -Ofast -pipe -ftree-vectorize -fstack-protector-strong"
    CXXFLAGS="-g -pipe -march=native -mtune=native -Ofast -pipe -ftree-vectorize -fstack-protector-strong -include /usr/include/c++/11*/limits"
    LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro"
    RUSTFLAGS="-C target-cpu=native -C opt-level=2"
    

    Проверьте echo $CXXFLAGS, и если изменения не применяются, перезапустите оболочку или ОС, или выйдите из текущего tty, или переключитесь на другой tty, или просто запустите в терминале:

    export CXXFLAGS="-g -pipe -march=native -mtune=native -Ofast -pipe -ftree-vectorize -fstack-protector-strong -include /usr/include/c++/11*/limits"
    

    or set -a; source /etc/environment; set +a;

    Я также пытался добавить в CXXFLAGS -include '<limits>' и -include '<limits.h>', но пишет Нет такого файла или каталога

    Также у меня есть другое решение (очень грязное):

    Добавьте это в /usr/include/stdint.h (или stdlib.h или какой-нибудь другой популярный файл) перед последней строкой (#endif):

    #ifdef __cplusplus
    extern "C++" {
           #include <limits>
    }
    #endif
    

    Ubuntu 21.04 и Debian Buster dpkg-query -S /usr/include/stdlib.h говорят, что он принадлежит libc6-dev:amd64. Arch Linux pacman -Qo /usr/include/stdlib.h говорит, что он принадлежит glibc. Так что этот хак будет перезаписан при обновлении пакета, не забывайте.

    27.06.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..