Baz Baz - 3 months ago 13
C++ Question

binary '<' : no operator found for map<std::string, shared_ptr<Foo>>

How can I resolve the following compiler error:

xstddef(180): error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const std::string' (or there is no acceptable conversion)
tuple(572): could be 'bool std::operator <(const std::tuple<> &,const std::tuple<> &)'
while trying to match the argument list '(const std::string, const std::string)'
xstddef(179) : while compiling class template member function 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const'
with
[
_Ty=std::string
]
map(177) : see reference to function template instantiation 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const' being compiled
with
[
_Ty=std::string
]
type_traits(743) : see reference to class template instantiation 'std::less<_Ty>' being compiled
with
[
_Ty=std::string
]
xtree(1028) : see reference to class template instantiation 'std::is_empty<_Ty>' being compiled
with
[
_Ty=std::less<std::string>
]
map(67) : see reference to class template instantiation 'std::_Tree<_Traits>' being compiled
with
[
_Traits=std::_Tmap_traits<std::string,IDispatcherPtr,std::less<std::string>,std::allocator<std::pair<const std::string,IDispatcherPtr>>,false>
]
main.cpp(506) : see reference to class template instantiation 'std::map<_Kty,_Ty>' being compiled
with
[
_Kty=std::string,
_Ty=IDispatcherPtr
]


for the following code:

class IDispatcher
{
virtual void operator()() = 0;
};

class AlarmDispatcher: public IDispatcher
{
virtual void operator()()
{
}
};

typedef boost::shared_ptr<IDispatcher> IDispatcherPtr;

int main()
{
std::map<std::string, IDispatcherPtr> dispatchers;
dispatchers["alarm"] = boost::make_shared<AlarmDispatcher>();

Answer

First problem:

You should include explicitly all the necessary headers, and not rely on them being indirectly included through the inclusion of other headers:

#include <string> // <== IN PARTICULAR THIS ONE
#include <map>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>

Judging from the comments, it seems you included the <string.h> header (which is a Standard C library header) rather than the <string> header, which is where the std::string class is defined.

Second problem:

You forgot to establish the inheritance relationship between your classes:

class AlarmDispatcher : public IDispatcher
//                    ^^^^^^^^
{
    virtual void operator()()
    {
    }
};