Я использую компилятор Intel C ++ вместе с qmake в QtCreator. В моем проекте я использую 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 был использован.
Кто-нибудь знает, почему компилятор Intel 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
но вызывает ошибку компилятора с ним.
У меня та же проблема, что вы описываете … очень странно. Любой другой компилятор (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;
}
Но это глупо.
Если вы считаете, vector<char>
один элемент представлен как просто char
,
map
однако (и другие ассоциативные контейнеры) не представлены таким образом. Скорее они представлены как pair
:
typedef pair<const Key, T> value_type;
Я не знаком с компилятором Intel C ++, но, судя по сообщению об ошибке, я бы сказал, что Intel реализует pair
с точки зрения tuple
учебный класс. Класс кортежа — это N-арная совокупность вещей. pair
например будет tuple
с двумя элементами.
Все вышеперечисленное является просто разработкой и не говорит о том, почему вы получаете эту ошибку. /usr/include/c++/4.8.0
выглядит для меня как каталог include для G ++ 4.8.0 — последней версии G ++. Если компилятор Intel ищет здесь, я бы сказал, что ваши пути испорчены, либо в вашей среде, либо в путях, отправленных компилятору Intel.
Проверьте переменные окружения и ваш make-файл.
Когда дело доходит до c ++ 11 по некоторым причинам, icpc не нравится оператор [] std :: map.
Для вставки новых значений необходимо использовать метод 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;
}