我在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
但会导致编译器错误。
答案 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
:
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;
}