No matching function for calling std :: transform, unresolved overloaded function type

I have the following, correct and compiling code:

#include <iostream>
#include <map>
#include <algorithm>

template<typename K, typename V>
void write_map(const std::multimap<K, V> mm)
{
    std::cout << "MultiMap content:"<< std::endl << std::endl;
    for(auto it = mm.begin(); it != mm.end(); it++)
        std::cout << it->first << "\t" << it->second << std::endl;
}

template<typename K, typename V>
void write_map(const std::map<K, V> m)
{
    std::cout << "Map content:"<< std::endl << std::endl;
    for(auto it = m.begin(); it != m.end(); it++)
        std::cout << it->first << "\t" << it->second << std::endl;
}

template<typename KV, typename VK>
std::pair<VK, KV> flip_pair(const std::pair<KV, VK> &p)
{
    return std::pair<VK, KV>(p.second, p.first);
}

template<typename KV, typename VK>
std::multimap<VK, KV> flip_map(const std::map<KV, VK> &src)
{
    std::multimap<VK, KV> dst;
    // LINE_B follows
    std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), flip_pair<KV, VK>);
    return dst;
}

int main(void)
{
    std::map<std::string, uint32_t> m_words_map1;

    std::pair<std::string, uint32_t> p1("aaa", 2);
    std::pair<std::string, uint32_t> p2("bbb", 1);
    m_words_map1.insert(p1);
    m_words_map1.insert(p2);
    write_map(m_words_map1);
    // LINE_A follows
    std::multimap<uint32_t, std::string> sorted_multimap1 = flip_map(m_words_map1);
    write_map(sorted_multimap1);
}

      

Which I will successfully compile on Debian 7.8 x64

, gcc 4.7.2

with

g++ foo.cpp -o foo -std=c++11

      

After that I have incorporated this bunch of features into a complex project that uses CMake (CMakeLists.txt follows here)

file(GLOB_RECURSE CORE_OBJ core/*.cpp)
file(GLOB_RECURSE LIB_OBJ_CPP lib/*.cpp)
file(GLOB_RECURSE LIB_OBJ_HPP lib/*.hpp)
file(GLOB_RECURSE LIB_OBJ_C lib/*.c)
list(APPEND LIB_OBJ ${LIB_OBJ_CPP} ${LIB_OBJ_HPP} ${LIB_OBJ_C})
file(GLOB_RECURSE USR_CPP usr/*.cpp)
file(GLOB_RECURSE USR_HPP usr/*.hpp)
list(APPEND USR_OBJ ${USR_CPP} ${USR_HPP})
list(APPEND BLOCKMON_LINK_LIBS pcap pthread boost_system boost_filesystem)
list(APPEND INCLUDE_DIRS lib/external/pugixml/src lib lib/external/factory lib/external/more lib/external/ lib/hash lib/bloom lib/pat core messages blocks ipfix core/block core/message core/composition core/scheduler core/time  ${USR_INCL})
include_directories( ${INCLUDE_DIRS} )
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -march=native -Wall -g -std=c++0x")
add_definitions(-D_GLIBCXX_USE_SCHED_YIELD -D_GLIBCXX_USE_NANOSLEEP)
target_link_libraries(blockmonpy blockmoncore boost_python)
link_directories(/usr/local/lib)
list(APPEND BLOCKMON_XML-RPC_LINK_LIBS xmlrpc_client++ xmlrpc_client xmlrpc++ xmlrpc xmlrpc_util xmlrpc_xmlparse xmlrpc_xmltok curl xmlrpc_packetsocket xmlrpc_server_abyss++ xmlrpc_server++ xmlrpc_server_abyss xmlrpc_server xmlrpc_abyss  pthread)
list(APPEND BLOCKMON_LINK_LIBS ${BLOCKMON_XML-RPC_LINK_LIBS})
target_link_libraries(blockmonWithXmlRPC blockmoncore ${BLOCKMON_LINK_LIBS})
add_library(blockmoncore SHARED ${CORE_OBJ} ${MSG_OBJ} ${IPFIX_OBJ} ${LIB_OBJ} ${BLOCKS_OBJ} ${USR_OBJ})
target_link_libraries(blockmoncore ${BLOCKMON_LINK_LIBS})
add_executable(blockmon bin/blockmon.cpp)
target_link_libraries(blockmon blockmoncore ${BLOCKMON_LINK_LIBS})

      

In the source file of this project, the fragment is mirrored into the original file without any changes. But here he make

stops and complains about the following. I've spiced up the output to better link error lines:

In instantiation of β€˜std::multimap<VK, KV> flip_map(const std::map<K, V>&) [with KV = std::basic_string<char>; VK = unsigned int]’:
LINE A:   required from here
LINE B: error: no matching function for call to β€˜transform(std::map<std::basic_string<char>, unsigned int>::const_iterator, std::map<std::basic_string<char>, unsigned int>::const_iterator, std::insert_iterator<std::multimap<unsigned int, std::basic_string<char> > >, <unresolved overloaded function type>)’
    note: candidates are:
    note: _OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation) [with _IIter = std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, unsigned int> >; _OIter = std::insert_iterator<std::multimap<unsigned int, std::basic_string<char> > >; _UnaryOperation = std::pair<unsigned int, std::basic_string<char> > (Class::*)(const std::pair<std::basic_string<char>, unsigned int>&)]
    note:   no known conversion for argument 4 from β€˜<unresolved overloaded function type>’ to β€˜std::pair<unsigned int, std::basic_string<char> > (Class::*)(const std::pair<std::basic_string<char>, unsigned int>&)’
/usr/include/c++/4.7/bits/stl_algo.h:4977:5: note: template<class _IIter1, class _IIter2, class _OIter, class _BinaryOperation> _OIter std::transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation)
/usr/include/c++/4.7/bits/stl_algo.h:4977:5: note:   template argument deduction/substitution failed:
LINE B: note:   candidate expects 5 arguments, 4 provided

      

+3


source to share


1 answer


Looking at your error message (grep ), I believe that you have somehow overloaded the function that you passed to in a different translation unit. is a template function , and its functor is passed as the template type. If you have overloads, you will not be able to infer the type of the conversion function, hence the error. See a toy example here that spits out essentially the same error message. <unresolved overloaded function type>

flip_pair<>

std::transform

std::transform

std::transform



+1


source







All Articles