4

我在 QtCreator 中使用 Intel C++ 编译器和 qmake。在我的项目中,我使用 std::map。

std::map<int,double> dataBase;
dataBase[2] = 2.445;

此代码使用 g++ 编译和运行没有任何问题。如果我尝试使用 ICC 进行编译,则会出现以下错误:

/usr/include/c++/4.8.0/tuple(1075): error: "pair" is not a nonstatic data member or base class of class "std::pair<const int, double>"

完整的编译器错误要长得多。我对包含路径有点困惑,因为对我来说它看起来像一个使用的 g++ 库。如果我注释掉这部分程序编译,我可以验证是否使用了 ICC。

有人知道为什么英特尔 C++ 编译器会导致此错误吗?

编辑:

我创建了一个最小的示例,并找到了导致此问题的编译器选项:以下是 *.pro 文件的内容

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp

QMAKE_CXXFLAGS += -std=c++11

主文件

#include <iostream>
#include <map>

using namespace std;

int main(){
    map<int,double> dataBase;
    dataBase[2] = 2.445;
    cout << dataBase[2] << endl;
    return 0;
}

它没有

-std=c++11

但会导致编译器错误。

4

3 回答 3

2

我遇到了和你描述的一样的问题......,真的很奇怪。其他所有编译器(clang、gcc、msvc11)都可以毫无问题地编译它。我猜这是因为 4.8.x 标头。icpc -v至少说version 13.1.1 (gcc version **4.7.0** compatibility)...

解决方法:

template<class K, class V>
V &changemapvalue(std::map<K, V> &map, K &key, V &val)
{
#if defined(__GNUC__) && defined(__INTEL_COMPILER)
    if (map.find(key) != map.end()) map.erase(key);
    map.insert(std::pair<K, V>(key, val));
#else
    map[key] = val;
#endif //__GNUC__ && __INTEL_COMPILER
    return val;
}

但这很愚蠢。

于 2013-06-10T14:08:33.473 回答
1

如果考虑 a vector<char>,则单个元素仅表示为 a char

然而, A map(和其他关联容器)不是以这种方式表示的。相反,它们表示为pair

{C++03} 23.3.1/2

typedef pair<const Key, T> value_type;

我不熟悉英特尔 C++ 编译器,但从错误消息来看,我会说英特尔pair是按照tuple类来实现的。元组类是事物的 N 元集合。Apair例如将是tuple具有两个元素的 a。

以上所有内容都只是详细说明,并没有真正说明您为什么会收到此错误。 /usr/include/c++/4.8.0在我看来,就像 G++ 4.8.0 的包含目录——最新版本的 G++。如果英特尔编译器在这里查看,我会说你的路径搞砸了,无论是在你的环境中还是在发送到英特尔编译器的路径中。

检查你的环境变量和你的makefile。

于 2013-05-21T16:28:34.260 回答
0

当谈到 c++11 时,icpc 不喜欢 std::map 的 operator[]。

要插入新值,您需要使用该方法insert(),而要访问现有值,您可以使用 c++11 方法at()

这可以正确编译icpc -std=c++11

#include <iostream>
#include <map>

using namespace std;

int main(){
    map<int,double> dataBase;
    dataBase.insert(pair<int,double>(2,2.445));
    cout << dataBase.at(2) << endl;
    return 0;
}
于 2013-07-31T09:15:03.460 回答