Poperton
Poperton

Reputation: 2148

Creating a Variant class and std::map<Variant, Variant>

I craeted a simple Variant class to store string, integer, double, etc. I'm trying to use a map of type std::map<Variant, Variant> but I'm getting this strange error:

In file included from /usr/include/c++/7/string:48:0,
                 from /home/dev/proj/cpp/common/Variant.h:3,
                 from /home/dev/proj/cpp/common/Event.h:3,
                 from /home/dev/proj/cpp/common/Event.cpp:1:
/usr/include/c++/7/bits/stl_function.h: In instantiation of 'constexpr bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Variant]':
/usr/include/c++/7/bits/stl_map.h:511:32:   required from 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [with _Key = Variant; _Tp = Variant; _Compare = std::less<Variant>; _Alloc = std::allocator<std::pair<const Variant, Variant> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = Variant; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = Variant]'
/home/dev/orwell/cpp/common/Event.cpp:33:18:   required from here
/usr/include/c++/7/bits/stl_function.h:386:20: error: no match for 'operator<' (operand types are 'const Variant' and 'const Variant')
       { return __x < __y; }
                ~~~~^~~~~

This is my Variant class:

class Variant
{
public:
    enum class Type
    {
        Integer,
        Double,
        String
    };

    Variant()
    {
    }

    Variant(int integer)
    {
        this->type = Type::Integer;
        setInteger(integer);
    }

    Variant(std::string string)
    {
        this->type = Type::String;
        setString(string);
    }

    Variant(double _double)
    {
        this->type = Type::Double;
        setDouble(_double);
    }

    Type type;

This is where the error is happening:

void Event::add(std::string key, std::string value) {
    this->map[key] = Variant(value); //problem here
}

Upvotes: 1

Views: 151

Answers (1)

user10957435
user10957435

Reputation:

std::map is a sorted array. To do that it uses the < operator.

Thus, if you want to use Variant in a map (I believe this only applies to keys), you will need to supply an operator<() for it. You can find some examples here.

Or, you'll need a comparison function. That can work too.

Upvotes: 3

Related Questions