繁体   English   中英

在SOLARIS上使用C ++ Pair初始化C ++ std映射时出错

[英]Error while init of C++ std map with C++ Pair ON SOLARIS

下面的代码在Linux中可以正常运行,但在Solaris中会给出编译器错误。 我试图初始化一个std对,然后使用它来初始化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.
#

要将C ++ 11功能与Solaris Studio C ++编译器一起使用, 必须使用-std=c++11选项。 根据Oracle®Solaris Studio 12.4的新增功能》指南

使用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功能的情况下,无需在脚本或生成文件中进行任何更改。 一个例外是Rogue Wave Tools.h ++不可用。 有关不再受支持的功能的更多信息,请参见《 Oracle Solaris Studio 12.4:发行说明》中的本发行版中已删除的功能。

要在C ++ 11模式下进行编译,请在CC命令行中添加选项–std = c ++ 11。 命令行上的位置并不重要。 该选项使编译器识别C ++ 11中的新增语言功能,并使用标准库(提供的g ++运行时库)的C ++ 11版本。 除了标记为与–std = c ++ 11不兼容的选项外,所有其他命令行选项均可与C ++ 11一起使用,并具有其通常的效果。 必须在用于构建库或可执行程序的每个CC命令上始终使用–std = c ++ 11选项。

想象一下,已经有大量的C ++代码安装基础,升级到新的编译器,并且默认语言选项从例如C ++ 03更改为C ++ 11, 并且破坏了许多已经可以运行的代码

它在Linux上完美运行

这可能是因为g ++的默认语言选项是GNU扩展的非标准C ++ 14

如果未提供C ++语言方言选项,则默认值为-std=gnu++14

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

任何人都知道如何在所有UNIX变体中都能使其正常运行?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM