簡體   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