lundi 18 mars 2019

Compilation error in RHEL 7.6 for STL insert when compiled with c++11

Below function calls are resulting in compilation errors in RHEL 7.6 with c++11 compiler option. But compiles successfully with RHEL 6. Please let me know what's the issue. Whether STL function definitions and templates has changed between RHEL 7.6 and RHEL 6 .Also please suggest how to resolve this compilation errors.

1. Funcation call:

outputSimArgMap->insert(std::make_pair($1, (SimArgList*) NULL));

Compilation error :

error: no matching function for call to ‘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: note: candidates are:
In file included from /usr/include/c++/4.8.2/map:61:0,
                 from /fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/include/SimArgs.h:8,
                 from /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/include/c++/4.8.2/bits/stl_map.h:594:7: note:   no known conversion for argument 1 from ‘std::pair<char*, CommHandler::SimArgList*>’ to ‘const value_type& {aka const std::pair<const std::basic_string<char>, 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> > >]
         insert(_Pair&& __x)
         ^
/usr/include/c++/4.8.2/bits/stl_map.h:602:9: note:   template argument deduction/substitution failed:
/usr/include/c++/4.8.2/bits/stl_map.h:598:32: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
       template<typename _Pair, typename = typename
                                ^
/usr/include/c++/4.8.2/bits/stl_map.h:615:7: note: void std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::initializer_list<std::pair<const _Key, _Tp> >) [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> > >]
       insert(std::initializer_list<value_type> __list)
       ^
/usr/include/c++/4.8.2/bits/stl_map.h:615:7: note:   no known conversion for argument 1 from ‘std::pair<char*, CommHandler::SimArgList*>’ to ‘std::initializer_list<std::pair<const std::basic_string<char>, 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> >]
       insert(const_iterator __position, const value_type& __x)
       ^
/usr/include/c++/4.8.2/bits/stl_map.h:644:7: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/4.8.2/bits/stl_map.h:655:9: note: template<class _Pair, class> std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator, _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> > >]
         insert(const_iterator __position, _Pair&& __x)
         ^
/usr/include/c++/4.8.2/bits/stl_map.h:655:9: note:   template argument deduction/substitution failed:
/fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:74:83: note:   cannot convert ‘std::make_pair<char*&, CommHandler::SimArgList*>((* & yyvsp->YYSTYPE::name), (* &0u))’ (type ‘std::pair<char*, CommHandler::SimArgList*>’) to type ‘std::map<std::basic_string<char>, std::shared_ptr<CommHandler::SimArgList>, ci_compare>::const_iterator {aka std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::shared_ptr<CommHandler::SimArgList> > >}’
        outputSimArgMap->insert(std::make_pair($1, (SimArgList*) NULL));
                                                                                   ^
In file included from /usr/include/c++/4.8.2/map:61:0,
                 from /fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/include/SimArgs.h:8,
                 from /fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:2:
/usr/include/c++/4.8.2/bits/stl_map.h:670:9: note: template<class _InputIterator> void std::map<_Key, _Tp, _Compare, _Alloc>::insert(_InputIterator, _InputIterator) [with _InputIterator = _InputIterator; _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> > >]
         insert(_InputIterator __first, _InputIterator __last)
         ^
/usr/include/c++/4.8.2/bits/stl_map.h:670:9: note:   template argument deduction/substitution failed:
/fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:74:83: note:   candidate expects 2 arguments, 1 provided
        outputSimArgMap->insert(std::make_pair($1, (SimArgList*) NULL));

2.)

Function call:

File CliParser.y ->

GetIntegralHelper SimArgMap::getArgument(const std::string& varName, bool mandatory, bool eraseElem)
{
    auto it = find(varName);
    if(it != end())
    {
        if(it->second == NULL)
            throw std::invalid_argument(varName+": value not provided");
        try
        {
            if(eraseElem)
            {
                std::string ret = std::move(it->second->getElemValue().getArgString());
                erase(it);
Line 263 ->     return ret;
            }

File SimArgs.h ->

    class GetIntegralHelper
       {
            std::string     m_str;
Line 53 ->  GetIntegralHelper(std::string&& str) : m_str(str) {}

Compilation Error :

In member function ‘CommHandler::GetIntegralHelper CommHandler::SimArgMap::getArgument(const string&, bool, bool)’:
/fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:263:24: error: cannot bind ‘std::string {aka std::basic_string<char>}’ lvalue to ‘std::string&& {aka std::basic_string<char>&&}’
                 return ret;
                        ^
In file included from /fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:2:0:
/fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/include/SimArgs.h:53:3: error:   initializing argument 1 of ‘CommHandler::GetIntegralHelper::GetIntegralHelper(std::string&&)’
   GetIntegralHelper(std::string&& str) : m_str(str) {}
   ^

3.)

Function call:

File CliParser.y ->

GetListHelper SimArgMap::getArgumentList(const std::string& varName, bool mandatory, bool eraseElem)
{
    auto it = find(varName);
    if(it != end())
    {
        if(eraseElem)
        {
            GetListHelper ret(std::move(*it->second), varName);
            erase(it);
            return ret;
        }
        else
        {

-> Line :294 return GetListHelper(*it->second, varName);

File SimArgs.h ->

    class GetListHelper
        {
             SimArgList m_list;
             const std::string& m_varName;
Line :81->   GetListHelper(SimArgList&& list, const std::string& varName) : m_list(std::move(list)), m_varName(varName) {}

Compilation Error:

In member function ‘CommHandler::GetListHelper CommHandler::SimArgMap::getArgumentList(const string&, bool, bool)’:
/fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:294:45: error: cannot bind ‘CommHandler::SimArgList’ lvalue to ‘CommHandler::SimArgList&&’
    return GetListHelper(*it->second, varName);
                                             ^
In file included from /fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/src/CliParser.y:2:0:
/fgw_test/test/NETSim/SimulatorNew/Common/CommHandler/include/SimArgs.h:81:3: error:   initializing argument 1 of ‘CommHandler::GetListHelper::GetListHelper(CommHandler::SimArgList&&, const string&)’
   GetListHelper(SimArgList&& list, const std::string& varName) : m_list(std::move(list)), m_varName(varName) {}
   ^

Thanks,

Aucun commentaire:

Enregistrer un commentaire