【问题标题】:Error while init of C++ std map with C++ Pair ON SOLARIS在 SOLARIS 上使用 C++ 对初始化 C++ 标准映射时出错
【发布时间】:2019-01-23 12:10:26
【问题描述】:

以下代码在 Linux 中运行正常,但在 Solaris 中出现编译器错误。我正在尝试初始化一个标准对,然后用它来初始化一个 C++ Map。它在 linux 中完美运行,但是 Solaris 遇到了这个问题。任何人都知道可以做些什么来使它在所有 UNIX 变体中都正常?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <iostream>
#include <map>
#define TRUE 1
#define FALSE 0

using namespace std;


std::pair<std::string, std::string> envVarsData[] =
{
        std::make_pair(std::string("HOME"), std::string("home")),
        std::make_pair(std::string("RETURNED"), std::string("Returned"))
};

size_t iSize = sizeof(envVarsData) / sizeof(envVarsData[0]);
std::map<std::string, std::string> envVarsMap(envVarsData, iSize);

int main()
{

 return 0;
}

抛出的错误如下

# CC t1.cpp
"t1.cpp", line 21: Error: Could not find a match for std::map<std::string,std::string>::map(std::pair<std::string, std::string>[2], unsigned) needed in<no tag>.
1 Error(s) detected.
#

【问题讨论】:

  • map 构造函数采用一对迭代器(例如指针),而不是指针和大小。 Makie 它std::map&lt;std::string, std::string&gt; envVarsMap(envVarsData, envVarsData + iSize);
  • 在 Solaris 上这仍然给出如下错误 # CC t1.cpp "t1.cpp", line 22: Error: Could not find a match for std::map<:string tag> 需要 :string>::map(std::pair<:string std::string>[2], std::pair<:string std::string>*)。检测到 1 个错误。
  • 我认为如果我使用以下选项编译 CC -std=c++11 t1.cpp,上述错误就会消失。但是,任何不使用此选项编译它的建议总是受欢迎的!!!!
  • 您是否使用了任何特定的标志,例如 -std=c++11 我在 SOLARIS 中构建并且没有上述编译标志就无法编译。该代码显示 linux 中没有问题

标签: c++ stl stdmap std-pair solaris-10


【解决方案1】:

要将 C++11 功能与 Solaris Studio C++ 编译器一起使用,您必须使用-std=c++11 选项。每the What's New in Oracle® Solaris Studio 12.4 guide

使用 C++11 功能

在 Oracle Solaris Studio 12.4 中,C++ 编译器支持 C++11,这是一种新的 语言和 ABI(应用程序二进制接口)。

在 C++ 11 模式下,CC 编译器使用 g++ ABI 和一个版本的 随 Oracle Solaris Studio 提供的 g++ 运行时库。为了 此版本使用了 g++ 运行时库的 4.8.2 版。

ABI 描述了生成的目标代码中的低级细节。 使用不同 ABI 的模块无法成功链接在一起 成一个程序。这意味着您必须在所有模块上使用 C++11 模式 在你的程序中,或者都没有。

如果您使用 Oracle Solaris Studio 12.4 C++ 作为 Oracle 的升级 Solaris Studio 12.3 (C++ 5.12),无需更改脚本或 如果您不使用 C++11 功能,请使用 makefile。一个例外是流氓 Wave Tools.h++ 不可用。有关功能的更多信息 不再受支持,请参阅此处已删除的功能 Oracle Solaris Studio 12.4 中的发行版:发行说明

要在 C++11 模式下编译,请将选项 –std=c++11 添加到 CC 命令行。 命令行上的位置并不重要。这 选项使编译器识别新的语言特性 C++11,并使用 C++11 版本的标准库(g++ 提供的运行时库)。标记为的选项除外 与–std=c++11不兼容,其他所有命令行选项都可以 与 C++11 一起使用,并具有它们通常的效果。 –std=c++11 必须在构建中使用的每个 CC 命令上一致地使用选项 库或可执行程序。

想象一下拥有大量安装的 C++ 代码,升级到新的编译器,并且将默认语言选项从 C++03 更改为 C++11代码。

在linux下完美运行

这可能是因为the default language option for g++ is GNU-extended, non-standard C++14:

如果没有给出 C++ 语言方言选项,默认值为-std=gnu++14

如果你想要可移植的代码,你不能在任何平台上使用非标准的扩展。

任何人都知道可以做些什么来使它在所有 UNIX 变体中都正常?

不要在任何平台上使用非标准的编译器扩展。

是的,这意味着您可能必须返回并更改 Linux 上的选项,如果您使用默认的 g++ 选项,则您正在使用 C++ 的非标准 GNU 扩展进行编译。

【讨论】:

    猜你喜欢
    • 2014-10-16
    • 2014-01-17
    • 2020-01-14
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多