Проблема в возврате значений operator[]

Проблема в возврате значений, проблема это - string& operator[] (const string index) и bool& operator[] (const string index) и она мне не позволяет взять значение с string(возвращает 1) но когда я переставляю строки местами(bool& на string&,вместе с их содержимым) то всё получается наоборот и возвращает пустоту, как это можно исправить? Мой код:

#include <iostream>
#include <string>
#include <map>

using namespace std;

class StringData
{
private:
    map<string, string> dataStrings;
    map<string, bool> dataBools;
public:
    string& operator[] (const string index)
    {
        return dataStrings[index];
    }
    bool& operator[] (const string index)
    {
        return dataBools[index];
    }
};

int main() 
{
    StringData a;
    a["test"] = false;
    a["test2"] = "Hello";
    cout << a["test"];
    cout << a["test2"];
    system("Pause");
}


Ответы (2 шт):

Автор решения: Harry

Неработоспособна сама идея - перегрузка, дающая две функции с одинаковыми сигнатурами:

string& operator[] (const string index);
bool&   operator[] (const string index);

Не допускает такого С++.

Рекомендую решение:

class StringData
{
private:
    map<string, string> dataStrings;
    map<string, bool> dataBools;
public:
    string& operator[] (const string index)
    {
        return dataStrings[index];
    }
    bool& operator[] (const char * index)
    {
        return dataBools[index];
    }
};

int main() 
{
    StringData a;
    a["test"] = false;
    a["test2"s] = "Hello";
    cout << a["test"] << endl;
    cout << a["test2"s] << endl;
}
→ Ссылка
Автор решения: KoVadim

Вариант от @Harry весьма странный и на код ревью я бы жестоко отказал за такое. Возьмём предложение @HolyBlackCat и оформим

#include <iostream>
#include <string>
#include <map>
#include <variant>

using namespace std;

class StringData
{
public:
    // будем храть все в варианте, но это с++17
    using two_t = std::variant<string,bool>;
private:
    map<string, two_t> dataStrings;
public:
    two_t& operator[] (const string index)
    {
        return dataStrings[index];
    }
};
// нам нужен оператор вывода этой структуры
std::ostream& operator<<(std::ostream& os, const StringData::two_t& t) {
    if(auto pval = std::get_if<std::string>(&t)) {
      os << *pval;
    }
    else if (auto pval = std::get_if<bool>(&t)) {
      os << *pval;
    }
    else {
        os << "<none>"; // ну мало чего
    }
     
    return os;
}

int main() 
{
    StringData a;
    a["test"] = false;
    a["test2"] = "Hello";
    cout << a["test"];
    cout << a["test2"];
}

правда оно только для с++17 и старше, но всегда можно и это обойти.

→ Ссылка