Создатель qt — ошибка Intel C ++: «pair» не является нестатическим членом данных или базовым классом класса «std :: pair» const int, double & gt; «

Я использую компилятор 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

но вызывает ошибку компилятора с ним.

4

Решение

У меня та же проблема, что вы описываете … очень странно. Любой другой компилятор (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;
}

Но это глупо.

2

Другие решения

Если вы считаете, vector<char>один элемент представлен как просто char,

map однако (и другие ассоциативные контейнеры) не представлены таким образом. Скорее они представлены как pair:

{C ++ 03} 23.3.1 / 2

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-файл.

1

Когда дело доходит до 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;
}
0
По вопросам рекламы [email protected]