Click here to Skip to main content
15,892,575 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
<small>Hi,

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,</small>

What I have tried:

<small>C++ code compilation on RHEL 7.6 using c++11 option</small>
Posted
Updated 19-Mar-19 23:30pm
Comments
k5054 18-Mar-19 14:25pm    
RHEL 6 ships with g++ 4.4, which doesn't include c++11 standard, just c++0x. The docs for both gcc4.8 (RHEL7) and gcc4.4 indicate that c++0x/c++11 was still a work in progress.
Can you build and install the latest gcc (8.3)? That claims to be fully compliant with c++11 standard, plus c++14 and c++17 too, so it might be worth upgrading.

1 solution

1. You are attempting to insert std::pair <char*, foo=""> into a map containing std::pair <std::string, foo>. This may not work in earlier versions of the C++ Standard. You can do explicit template instantiation - replace make_pair() with pair <std::string, foo>().
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900