c++ объект статической инициализации map<T1,T2>

127
02 декабря 2019, 23:00

Не получается правильно сконструировать класс для статической инициализации map<T1,T2>, ругается на синтаксис и просит точку с запятой там где не надо. В общем запутался в синтаксисе..

Header.h

  typedef std::map<long, std::wstring> HresMap;
  HresMap HresTest;
template <typename T, typename U>
class InitStaticMap2
{
private:
    std::map<T, U> _map;
public:
    InitStaticMap2::InitStaticMap2(std::map<T, U>& map)
    {
        _map = map;
        return *this;
    }
    InitStaticMap2<T, U>& operator() (const T& key, const U& val) const
    {
        _map[key] = val;
        return *this;
    }
    operator std::map<T, U>()
    {
        return _map;
    }
};

Source.cpp

  #include "Header.h"
  InitStaticMap2<long, std::wstring>(HresTest)
       (123L, L"aaa")
       (124L, L"baa")
       (125L, L"aba");

вот оригинальный класс, в таком виде собирается и работает, VS2017

Header.h

namespace ErrorList
{
    template <typename T, typename U>
    class InitStaticMap
    {
    private:
        std::map<T, U> _map;
    public:
        InitStaticMap::InitStaticMap(const T& key, const U& val)
        {
            _map[key] = val;
        }
        InitStaticMap<T, U>& operator()(const T& key, const U& val)
        {
            _map[key] = val;
            return *this;
        }
        operator std::map<T, U>()
        {
            return _map;
        }
    };
    typedef std::map<long, std::wstring> HresMap;
    HresMap HresultTest = InitStaticMap<long, std::wstring>
       (123L, L"aaa")
       (124L, L"baa")
       (125L, L"aba");
}
Answer 1

Если хитрая инициализация глобального объекта, то можно сделать так:

std::map<int, std::string> globalMap 
    = [] {
        std::map<int, std::string> result;
        result[1] = "1";
        result[2] = "2";
        return result;
    }();

Если инициализация простая, то

std::map<int, std::string> globalMap = {{1, "1"}, {2, "2"}};

Если очень хочется использовать InitStaticMap2, то

template <typename T, typename U>
class InitStaticMap2
{
private:
    std::map<T, U> _map;
public:
    InitStaticMap2<T, U>& operator() (const T& key, const U& val)
    {
        _map[key] = val;
        return *this;
    }
    operator std::map<T, U>()
    {
        return _map;
    }
};
std::map<int, std::string> mp = InitStaticMap2<int, std::string>()(1, "2")(2, "2");
READ ALSO
GTK+ программа не изменяет стиль

GTK+ программа не изменяет стиль

На Debian 98 c Gnome GTK+ программа не изменяет стиль

147
Ошибка Microsoft C++ exception: std::out_of_range at memory location [закрыт]

Ошибка Microsoft C++ exception: std::out_of_range at memory location [закрыт]

Выдает ошибку Microsoft C++ exception: std::out_of_range at memory location Как я поняла, то ошибка в последней функции replaceНо что именно не так, не вижу

265
Реализация Singleton в С++

Реализация Singleton в С++

Функция, которая возвращает singleton:

134