C++ from 11 to 17

146
08 января 2021, 14:30

При переходе данный код заголовка перестал работать

#include<iostream>
#include<cmath>
#include<limits>
  const double _infinity=
     std::numeric_limits<double>::infinity();
  const double pi= 4.*std::atan(1.);
  const double e = std::exp(1.);
  inline double display(double x){
     std::cout.precision(16);
     std::cout<<x;return 0;}
  inline double display(int x){
     std::cout<<x;return 0;}
  inline double display(char x){
     std::cout<<x;return 0;}
  inline double display(const char* x){
     std::cout<<x;return 0;}
  inline double display(bool x){
     std::cout<<'#'<<(x ? 't' : 'f');return 0;}
  inline double newline(){
    std::cout<< std::endl;return 0;}
  inline double remainder(double x, double y)
    { return std::fmod(x, y);}
  inline double quotient(double x, double y)
    { return std::floor(x / y);}
  inline double expt(double x, double y)
    { return std::pow(x, y);}
  inline double abs(double x) { return std::fabs(x);}
using std::sin;using std::cos;
using std::tan;using std::exp;
using std::log;using std::atan;
using std::sqrt;

Ошибки:

Ошибка C2382 abs: переопределение; разные спецификации исключений

Предупреждение C28251 Несогласованная аннотация для "remainder": данный экземпляр содержит нет аннотаций. См. c:\program files (x86)\windows kits\10\include\10.0.17763.0\ucrt\corecrt_math.h(530). Примечание. Для данной функции имеется несколько прототипов. Это предупреждение сравнивает первый прототип с номером экземпляра 3. lb1 c:\users\bbcca\onedrive\рабочий стол\microlisp\lb1\mlisp.h 22

Answer 1

Название вашей функции remainder совпадает с std::remainder из <cmath>.

Обычно это не проблема, ведь пространства имен разные, но судя по https://en.cppreference.com/w/cpp/header#C_compatibility_headers

... cxxx headers are allowed to also declare the same names in the global namespace ...

хедерам вида c___ (оставшимся от С) разрешается все свое содержимое, в дополнение к namespace std, объявлять также в глобальном пространстве имен.

Это здесь и происходит, std::remainder объявляется еще и как просто remainder.

Ничего не поделаешь, переименовывайте свою функцию. Или убирайте в namespace.

Answer 2

Проблема вроде как очевидна - объявление в глобальном пространстве символов с именем, уже используемым в бибилиотечном коде. Добавляйте новый символы в собственное пространство имен с уникальным именем, ну или используйте уникальные имена при добавлении в глобальное пространство имен.

READ ALSO
Что такое AOS, SOA, SOS?

Что такое AOS, SOA, SOS?

Что такое Array of Structure, Structure of Array, Structure of Structure ? Когда использовать?

135
Консольная программа на C++ с использованием UNICODE

Консольная программа на C++ с использованием UNICODE

Проблема в приведении типов при попытке написать код для WinAPIПрограмма простенькая, для вывода таблицы умножения

120
Проверка слов строки на наличие буквы, на которую кончается и начинается

Проверка слов строки на наличие буквы, на которую кончается и начинается

Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими)Определить количество слов, которые...

102