Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;类中的全局映射,不打印映射元素。使用cmake_C++_C++11_Stdmap_C++03 - Fatal编程技术网

C++ c++;类中的全局映射,不打印映射元素。使用cmake

C++ c++;类中的全局映射,不打印映射元素。使用cmake,c++,c++11,stdmap,c++03,C++,C++11,Stdmap,C++03,我试图在类a中定义一个全局映射,然后在类b中使用它。 虽然地图不是空的,但我看不到元素 另一个困扰我的问题是,我如何知道我的代码是否使用c++11标准编译? 我如何设置它,用c++98或c++2003编译 我有5个文件: 映射用户 #include <map> #include <string> #include <stdint.h> using namespace std; extern std::map<string, uint8_t> m

我试图在类a中定义一个全局映射,然后在类b中使用它。 虽然地图不是空的,但我看不到元素

另一个困扰我的问题是,我如何知道我的代码是否使用c++11标准编译? 我如何设置它,用c++98或c++2003编译

我有5个文件:

  • 映射用户

    #include <map>
    #include <string>
    #include <stdint.h>
    
    using namespace std;
    
    extern std::map<string, uint8_t> map_global;
    
    class map_user_a
    {
        public: 
            void init();
        private:
            int user_a;
    };
    
  • 现在,我正在使用cmake在Ubuntu17.10.1下编译代码

    CMakeLists.txt是

    cmake_minimum_required(VERSION 3.9)
    
    project (stl)
    
    add_executable(stl map_user_a.cpp map_user_a.h map_user_b.cpp map_user_b.h main.cpp)
    
    在调用cmake../build(build是我的build目录)之后,我调用make,代码编译没有错误

    但是我的输出是第一对空的,尽管map有元素

    map_user_a::init()
    map_user_b::use()
    global map first pair=
    
    怎么了?
    谢谢。

    std::uint8\u t
    很可能是
    无符号字符的typedef。当您向
    std::ostream
    提供
    char
    unsigned char
    signed char
    时,它不会将其视为数字,而是将其视为字符。因此,您的程序打印的不是数字八进制
    010
    /decimal
    8
    ,而是以该数字作为其代码的字符。假设您的字符集是ASCII的扩展,这是不可打印的字符“backspace”,因此您的终端可能会忽略它

    要将
    std::uint8\u t
    打印为数字,请向
    unsigned int
    添加显式强制转换:

    cout << "global map first pair=" << static_cast<unsigned int>(map_global["1"]) << endl;
    

    让我回答你的第二个问题。您可以将以下语句添加到CMakeLists.txt文件中,以强制编译器使用C++11标准

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11")
    
    其他标准设置如下所示:

  • -std=c++98,或-std=c++03---c++98(c++2003)
  • -std=c++11-----c++11
  • -std=c++14---c++14
  • -std=c++17或-std=c++1z-----c++17
  • -std=gnu++98---C++98和gnu扩展
  • -std=gnu++11---C++11和gnu扩展
  • -std=gnu++14---C++14和gnu扩展
  • -std=gnu++1z---C++17和gnu扩展
  • 至于默认标准,它取决于您使用的编译器和编译器的版本。我认为最好用上述方法来澄清C++标准。

    您可以使用CMakeLists.txt中的以下语句来测试编译器支持的标准并进行设置

    include(CheckCXXCompilerFlag)
    CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
    CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
    CHECK_CXX_COMPILER_FLAG("-std=c++17" COMPILER_SUPPORTS_CXX17)
    if(COMPILER_SUPPORTS_CXX17)
        message(STATUS "support c++17")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
    elseif(COMPILER_SUPPORTS_CXX14)
        message(STATUS "support c++14")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
    elseif(COMPILER_SUPPORTS_CXX11)
        message(STATUS "support c++11")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    endif()
    

    请避免在同一个SO问题中提出不相关的问题。但是,您可能对在CMASE中设置C++语言版本的问答感兴趣:从任何函数中省略返回类型是无效的:<代码>主()/<代码>应该是代码> int()/<代码>。使用名称空间std编写
    在全局范围内,尤其是在头文件中,被认为是有害的:请参阅不相关。。。我的makefile生成以下命令:g++-O3-ggdb-std=c++17-Wall-Wextra-Wshadow-Wnon virtual dtor-pedantic-Werror=vla-Wcast align-Wcast qual-Wconversion-Wpointer arith-Wunused-Wold-style cast-Woverloaded virtual-MMD-MP-O0.././bag/src/dtb_assert.o GameOfLife.cc-o GameOfLife-lncurses-pthread您可以添加一些方法吗强制编译器使用C++98和C++2003标准?此外,我如何知道我编写的代码的默认或当前标准是什么。我希望能帮上忙
    
    map_user_a::init()
    map_user_b::use()
    global map first pair=
    
    cout << "global map first pair=" << static_cast<unsigned int>(map_global["1"]) << endl;
    
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11")
    
    include(CheckCXXCompilerFlag)
    CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
    CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
    CHECK_CXX_COMPILER_FLAG("-std=c++17" COMPILER_SUPPORTS_CXX17)
    if(COMPILER_SUPPORTS_CXX17)
        message(STATUS "support c++17")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
    elseif(COMPILER_SUPPORTS_CXX14)
        message(STATUS "support c++14")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
    elseif(COMPILER_SUPPORTS_CXX11)
        message(STATUS "support c++11")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    endif()