gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:30 26 4
gpt4 key购买 nike

以下代码在 Linux 中运行正常,但在 Solaris 中出现编译错误。我正在尝试初始化一个标准对,然后用它来初始化一个 C++ 映射。它在 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.
#

最佳答案

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

Using C++11 Features

In Oracle Solaris Studio 12.4, the C++ compiler supports C++11, a new language and ABI (Application Binary Interface).

In C++ 11 mode, the CC compiler uses the g++ ABI and a version of the g++ runtime library that is supplied with Oracle Solaris Studio. For this release, version 4.8.2 of the g++ runtime library is used.

An ABI describes the low-level details in the generated object code. Modules that use different ABIs cannot successfully be linked together into a program. This means that you must use C++11 mode on all modules in your program, or none of them.

If you use Oracle Solaris Studio 12.4 C++ as an upgrade to Oracle Solaris Studio 12.3 (C++ 5.12), no changes are needed in scripts or makefiles if you are not using C++11 features. An exception is Rogue Wave Tools.h++ is not available. For more information about features no longer supported, see Features That Have Been Removed in This Release in Oracle Solaris Studio 12.4: Release Notes

To compile in C++11 mode, add the option –std=c++11 to the CC command line. The location on the command line is not important. The option causes the compiler to recognize language features new in C++11, and to use the C++11 version of the standard library (g++ runtime library that is supplied). Except for the options marked as incompatible with –std=c++11, all other command-line options can be used along with C++11, and have their usual effects. The –std=c++11 option must be used consistently on every CC command used in building a library or executable program.

想象一下,有一个庞大的 C++ 代码安装基础,升级到一个新的编译器,并且默认语言选项从 C++03 更改为 C++11并打破了很多已经工作的代码

It runs perfectly in linux

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

The default, if no C++ language dialect options are given, is -std=gnu++14.

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

Any one has idea what can be done to make it OK in all UNIX variations?

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

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

关于c++ - 在 SOLARIS 上使用 C++ Pair 初始化 C++ std 映射时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51878631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com