sarali Ответов: 1

Ошибка компиляции C++11 в STL insert : on RHEL 7.6


<small>Привет,

Ниже приведены вызовы функций, приводящие к ошибкам компиляции в RHEL 7.6 с опцией компилятора c++11. Но успешно компилируется с RHEL 6. Пожалуйста, дайте мне знать, в чем проблема. Изменились ли определения и шаблоны функций STL между RHEL 7.6 и RHEL 6 .Также, пожалуйста, предложите, как устранить эти ошибки компиляции.

1. Функция вызова:
-----------------
outputSimArgMap->insert(std::make_pair($1, (SimArgList*) NULL));


Ошибка компиляции :
-------------------
ошибка: нет соответствующей функции для вызова ‘CommHandler::SimArgMap::insert(std::pair<char*, CommHandler::SimArgList*>)’
outputSimArgMap->insert(std::make_pair($1, (SimArgList*) NULL));
^
/fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:74:83: Примечание: кандидаты являются:
В файле included from /usr/include/c++/4.8.2/map:61:0,
from /fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/include/SimArgs.h:8,
из файла /fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:2:
/usr/include/c++/4.8.2/bits/stl_map.h:594:7: note: std::pair<typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(const value_type&) [with _Key = std::basic_string<char>; _Tp = std::shared_ptr<CommHandler::SimArgList>; _Compare = ci_compare; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::shared_ptr<CommHandler::SimArgList> > >; typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator = std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::shared_ptr<CommHandler::SimArgList> > >; std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair<const std::basic_string<char>, std::shared_ptr<CommHandler::SimArgList> >]
insert(const value_type& __x)
^
в /usr/включать/с++/4.8.2/биты/stl_map.ч:594:7: внимание: не известно преобразования аргумента от 1 ‘с std::пара&ЛТ;char*, то CommHandler::SimArgList*&ГТ;’ в ‘const и с value_type&амп; {ака константный СТД::пара&ЛТ;константный СТД::элементах&ЛТ;чар&ГТ; и std::shared_ptr&ЛТ;CommHandler::SimArgList&ГТ; &ГТ;&амп;}’
/usr/include/c++/4.8.2/bits/stl_map.h:602:9: note: template<class _Pair, class> std::pair<typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(_Pair&&) [with _Pair = _Pair; <template-parameter-2-2> = <template-parameter-1-2>; _Key = std::basic_string<char>; _Tp = std::shared_ptr<CommHandler::SimArgList>; _Compare = ci_compare; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::shared_ptr<CommHandler::SimArgList> > >]
вставить(_Pair&& __x)
^
в /usr/включать/с++/4.8.2/биты/stl_map.ч:602:9: Примечание: аргумент шаблона вычета/замещения не:
в /usr/включать/с++/4.8.2/биты/stl_map.ч:598:32: ошибка: Нет Тип по имени ‘тип’ в ‘структуре с std::enable_if&ЛТ;ложь, пустоту и GT;’
шаблон<typename _Pair, typename = typename
^
в /usr/включать/с++/4.8.2/биты/stl_map.ч:615:7: Примечание: пустота СТД::МАП&ЛТ;_Key, _Tp, _Compare, _Alloc&ГТ;::вставить(с std::initializer_list&ЛТ;СТД::пара&ЛТ;строительства _Key, _Tp&ГТ; &ГТ;) [с _Key = с std::элементах&ЛТ;чар&ГТ;; _Tp = с std::shared_ptr&ЛТ;CommHandler::SimArgList&ГТ;; _Compare = ci_compare; _Alloc = с std::распределитель&ЛТ;СТД::пара&ЛТ;константный СТД::элементах&ЛТ;чар&ГТ; и std::shared_ptr&ЛТ;CommHandler::SimArgList&ГТ; &ГТ; &ГТ;]
insert(std::initializer_list<value_type> __list)
^
в /usr/включать/с++/4.8.2/биты/stl_map.ч:615:7: внимание: не известно преобразования аргумента от 1 ‘с std::пара&ЛТ;char*, то CommHandler::SimArgList*&ГТ;’ в ‘с std::initializer_list&ЛТ;СТД::пара&ЛТ;константный СТД::элементах&ЛТ;чар&ГТ; и std::shared_ptr&ЛТ;CommHandler::SimArgList&ГТ; &ГТ; &ГТ;’
/usr/include/c++/4.8.2/bits/stl_map.h:644:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator, const value_type&) [with _Key = std::basic_string<char>; _Tp = std::shared_ptr<CommHandler::SimArgList>; _Compare = ci_compare; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::shared_ptr<CommHandler::SimArgList> > >; std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::shared_ptr<CommHandler::SimArgList> > >; std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::shared_ptr<CommHandler::SimArgList> > >; std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair<const std::basic_string<char>, std::shared_ptr<CommHandler::SimArgList> >]
вставка(const_iterator __должность, константный типа value_type&амп; __х)
^
/usr/include/c++/4.8.2/bits/stl_map.h:644:7: Примечание: кандидат ожидает 2 аргумента, 1 предоставленный
в /usr/включать/с++/4.8.2/биты/stl_map.ч:655:9: Примечание: шаблон&ЛТ;класс _Pair, класс&ГТ; СТД::МАП&ЛТ;_Key, _Tp, _Compare, _Alloc&ГТ;::итератор с std::карта&ЛТ;_Key, _Tp, _Compare, _Alloc&ГТ;::вставить(СТД::МАП&ЛТ;_Key, _Tp, _Compare, _Alloc&ГТ;::const_iterator, _Pair и усилитель;&) [с _Pair = _Pair; &ЛТ;шаблон-параметр-2-2 и GT; = &ЛТ;шаблон-параметр-1-2&ГТ;; _Key = с std::элементах&ЛТ;чар&ГТ;; _Tp = с std::shared_ptr&ЛТ;CommHandler::SimArgList&ГТ;; _Compare = ci_compare; _Alloc = с std::распределитель&ЛТ;СТД::пара&ЛТ;константный СТД::элементах&ЛТ;чар&ГТ;, СТД::shared_ptr&ЛТ;CommHandler::SimArgList&ГТ; &ГТ; &ГТ;]
insert(const_iterator __position, _Pair&& __x)
^
в /usr/включать/с++/4.8.2/биты/stl_map.ч:655:9: Примечание: аргумент шаблона вычета/замещения не:
/fgw_test/тест/NETSim/SimulatorNew/общие/CommHandler/в src/CliParser.г:74:83: Примечание: невозможно преобразовать ‘СТД::например, make_pair&ЛТ;char*и усилитель;, CommHandler::SimArgList*&ГТ;((* &амп; yyvsp-&ГТ;YYSTYPE::имя), (* &амп;0u кабелей))’ (тип ‘с std::пара&ЛТ;char*, то CommHandler::SimArgList*&ГТ;’) для типа ‘СТД::МАП&ЛТ;СТД::элементах&ЛТ;тип char&ГТ; и std::shared_ptr&ЛТ;CommHandler::SimArgList&ГТ;, ci_compare&ГТ;::const_iterator {ака СТД::_Rb_tree_const_iterator&ЛТ;СТД::пара&ЛТ;константный СТД::элементах&ЛТ;чар&ГТ; и std::shared_ptr&ЛТ;CommHandler::SimArgList&ГТ; &ГТ; &ГТ;}’
outputSimArgMap->insert(std::make_pair($1, (SimArgList*) NULL));
^
В файле included from /usr/include/c++/4.8.2/map:61:0,
from /fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/include/SimArgs.h:8,
из файла /fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:2:
в /usr/включать/с++/4.8.2/биты/stl_map.ч:670:9: Примечание: шаблон&ЛТ;класс _InputIterator&ГТ; недействительным СТД::МАП&ЛТ;_Key, _Tp, _Compare, _Alloc&ГТ;::вставить(_InputIterator, _InputIterator) [с _InputIterator = _InputIterator; _Key = с std::элементах&ЛТ;чар&ГТ;; _Tp = с std::shared_ptr&ЛТ;CommHandler::SimArgList&ГТ;; _Compare = ci_compare; _Alloc = с std::распределитель&ЛТ;СТД::пара&ЛТ;константный СТД::элементах&ЛТ;чар&ГТ; и std::shared_ptr&ЛТ;CommHandler::SimArgList&ГТ; &ГТ; &ГТ;]
вставка(_InputIterator __во-первых, _InputIterator __последний)
^
/usr/include/c++/4.8.2/bits/stl_map.h:670:9: Примечание: ошибка вычета/подстановки аргументов шаблона:
/fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:74:83: Примечание: кандидат ожидает 2 аргумента, 1 предоставленный
outputSimArgMap->insert(std::make_pair($1, (SimArgList*) NULL));


2.)

Вызов функции:
----------------

Файл CliParser.y ->

GetIntegralHelper SimArgMap::getArgument(const std::string& varName, bool mandatory, bool eraseElem)
{
авто это = найти(имя_переменной);
если(это != конец())
{
if(it->second == NULL)
throw std::invalid_argument(varName+": значение не указано");
пробовать
{
если(eraseElem)
{
СТД::строка рэт = с std::двигаться(это-&ГТ;второй-&ГТ;getElemValue().getArgString());
стереть его);
Строка 263 -> return ret;
}



Файл SimArgs.h ->

класс GetIntegralHelper
{
std::строка m_str;
Строка 53 -&ГТ; GetIntegralHelper(СТД::строка&&усилителя; ул.) : m_str(ул.) {}

ошибка компиляции :
----------------------

В CommHandler функции-члена‘:: GetIntegralHelper CommHandler::SimArgMap::getArgument(константные строки&амп;, типа bool и boolean)’:
/fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:263:24: ошибка: невозможно привязать ‘std::string {aka std::basic_string<char>}’ lvalue к ‘std::string&& {aka std::basic_string<char>}’
вернуться в отставке;
^
В файле, включенном из /fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:2:0:
/fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/include/SimArgs.h:53:3: ошибка: инициализация аргумента 1 ‘CommHandler::GetIntegralHelper::GetIntegralHelper(std::string&&)’
GetIntegralHelper(std::string&& str) : m_str(str) {}
^

3.)

Вызов функции:
---------------


Файл CliParser.y ->

GetListHelper SimArgMap::getArgumentList(const std::string& varName, bool mandatory, bool eraseElem)
{
авто это = найти(имя_переменной);
если(это != конец())
{
если(eraseElem)
{
GetListHelper ret(std::move(*it->second), varName);
стереть его);
вернуться в отставке;
}
еще
{

-&ГТ; линия :294 возвращение GetListHelper(*это-&ГТ;во-вторых, переменная);


Файл SimArgs.h ->

класс GetListHelper
{
SimArgList m_list;
константные СТД::строка&амп; m_varName;
Линия :81-&ГТ; GetListHelper(SimArgList&амп;&амп; лист, константные СТД::строка&амп; имя_переменной) : m_list(с std::двигаться(список)), m_varName(имя_переменной) {}


ошибка компиляции:
-------------------

В CommHandler функции-члена‘:: GetListHelper CommHandler::SimArgMap::getArgumentList(константные строки&амп;, типа bool и boolean)’:
/fgw_test/тест/NETSim/SimulatorNew/общие/CommHandler/в src/CliParser.г:294:45: ошибка: не удается выполнить привязку CommHandler‘:: именующее SimArgList " до " CommHandler::SimArgList и усилитель;&’
вернуться GetListHelper(*это-&ГТ;во-вторых, переменная);
^
В файле, включенном из /fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:2:0:
/fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/include/SimArgs.h:81:3: ошибка: инициализация аргумента 1 ‘CommHandler::GetListHelper::GetListHelper(CommHandler::SimArgList&&, const string&)’
GetListHelper(SimArgList&амп;&амп; лист, константные СТД::строка&амп; имя_переменной) : m_list(с std::двигаться(список)), m_varName(имя_переменной) {}
^

Спасибо,</small>

Что я уже пробовал:

компиляция кода <small>C++ на RHEL 7.6 с использованием опции c++11</small>

k5054

RHEL 6 поставляется с g++ 4.4, который не включает стандарт c++11, а только c++0x. Документы как для gcc4.8 (RHEL7), так и для gcc4.4 указывают на то, что c++0x/c++11 все еще находится в стадии разработки.
Можете ли вы построить и установить последнюю версию gcc (8.3)? Он утверждает, что полностью соответствует стандарту c++11, а также c++14 и c++17, так что его, возможно, стоит обновить.

1 Ответов

Рейтинг:
6

Daniel Pfeffer

1. Вы пытаетесь вставить с std::пара &ЛТ;char*, то функция Foo=""&ГТ; в карте содержащий с std::пара &ЛТ;СТД::строка, фу&ГТ;. Это может не работать в более ранних версиях стандарта C++. Вы можете сделать явное создание экземпляра шаблона - заменить make_pair() на pair <std::string, foo>().