Обновление до C ++ 17 - ошибка: ‘__BEGIN_NAMESPACE_STD’ не называет тип - PullRequest
6 голосов
/ 21 марта 2019

Я пытаюсь обновить приложение до C ++ 17 и получаю следующую ошибку компилятора:

error: ‘__BEGIN_NAMESPACE_STD’ does not name a type

Я использую gcc (GCC) 8.2.0 и компилирую с помощью следующей команды:

g++ -std=c++17 variant.cpp -o variant

Вот небольшая тестовая программа:

#include <iostream>
#include <variant>

using v_t = std::variant<int, double>;

int main(int argc, char const* argv[]) {

    v_t foo = 5;
    printf("foo contains %d\n", *std::get_if<int>(&foo));

    std::cout << "Success" << std::endl;
    return 0;
}

И вот ошибка, которую я получаю (ниже).Обратите внимание, что как включить __BEGIN_NAMESPACE_STD в stdlib.h обсуждает похожую проблему, но предлагаемое решение (включая заголовки C ++, а не заголовки C, такие как stdlib.h), я уже делаю.

Я могу скомпилировать этот код на моем ноутбуке с OSX, возможно, потому, что у меня установлен новый libc по умолчанию.Однако, когда я работаю на своей машине с Linux, я получаю эти ошибки.На машине Linux я использую следующую версию компоновщика / glibc: ldd (Ubuntu EGLIBC 2.19-0ubuntu6.14) 2.19

Я продолжаю отлаживать это, но буду признателен за любые указатели в правильном направлении.

In file included from /toolchains/gcc-8.2.0/include/c++/8.2.0/cstdlib:75,
                 from /toolchains/gcc-8.2.0/include/c++/8.2.0/ext/string_conversions.h:41,
                 from /toolchains/gcc-8.2.0/include/c++/8.2.0/bits/basic_string.h:6391,
                 from /toolchains/gcc-8.2.0/include/c++/8.2.0/string:52,
                 from /toolchains/gcc-8.2.0/include/c++/8.2.0/bits/locale_classes.h:40,
                 from /toolchains/gcc-8.2.0/include/c++/8.2.0/bits/ios_base.h:41,
                 from /toolchains/gcc-8.2.0/include/c++/8.2.0/ios:42,
                 from /toolchains/gcc-8.2.0/include/c++/8.2.0/ostream:38,
                 from /toolchains/gcc-8.2.0/include/c++/8.2.0/iostream:39,
                 from variant.cpp:1:
/usr/include/stdlib.h:95:1: error: ‘__BEGIN_NAMESPACE_STD’ does not name a type
 __BEGIN_NAMESPACE_STD
 ^~~~~~~~~~~~~~~~~~~~~
/usr/include/stdlib.h:101:5: error: ‘div_t’ does not name a type; did you mean ‘pid_t’?
   } div_t;
     ^~~~~
     pid_t
/usr/include/stdlib.h:112:1: error: ‘__END_NAMESPACE_STD’ does not name a type
 __END_NAMESPACE_STD
 ^~~~~~~~~~~~~~~~~~~
/usr/include/stdlib.h:121:5: error: ‘lldiv_t’ does not name a type; did you mean ‘ldiv_t’?
   } lldiv_t;
     ^~~~~~~
...