英特尔C ++错误:“pair”不是非静态数据成员或类“std :: pair <const int,=”“double =”“>”</const>的基类

时间:2013-05-21 15:33:47

标签: c++ qt-creator qmake icc

我在QtCreator中使用英特尔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>"

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

有人知道英特尔C ++编译器导致此错误的原因吗?

编辑:

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

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

SOURCES += main.cpp

QMAKE_CXXFLAGS += -std=c++11

的main.cpp

#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

但会导致编译器错误。

3 个答案:

答案 0 :(得分: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;
}

但这很愚蠢。

答案 1 :(得分:1)

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

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

{C ++ 03} 23.3.1 / 2

typedef pair<const Key, T> value_type;

我不熟悉英特尔C ++编译器,但从错误消息判断我会说英特尔在pair类方面实施tuple。元组类是N-ary集合的东西。例如,pair将是具有两个元素的tuple

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

检查环境变量和makefile。

答案 2 :(得分: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;
}