Когда вы определяете статический член класса, независимо от того, создан ли этот класс или нет, этот член доступен через память.В этом случае, поскольку они являются открытыми членами, использование самих строк в качестве ключей совершенно допустимо.
При этом ваши статические постоянные члены должны быть инициализированы после определения класса, обычночто-то вроде:
class Foo { static const int foo; };
const int Foo::foo = 42;
Для примера статической карты вы должны иметь в виду, что карта должна быть инициализирована аналогичным образом, если она используется в качестве члена класса.Вот рабочий пример:
// Compiled with g++ --std=c++17 -Wall -Wextra -Werror ConstStaticMapExample.cpp -o ConstStaticMapExample
#include <iostream>
#include <string>
#include <map>
class A
{
public:
static const std::string NAME;
//Other class specific methods
};
const std::string A::NAME = "foo";
class B
{
public:
static const std::string NAME;
//Other class specific methods
};
const std::string B::NAME = "bar";
class C
{
public:
static const std::map<std::string, std::string> versionMap;
// More definitions
};
const std::map<std::string, std::string> C::versionMap = {{A::NAME,"aA"},{B::NAME,"bB"}}; // Reversed for explanation
int main(int,char**)
{
// local static
static const std::map<std::string, std::string> versionMap = {{A::NAME,"Aa"},{B::NAME,"Bb"}};
std::cout << "LOCAL STATIC EXAMPLE:" << std::endl;
for(auto mpair : versionMap)
{
std::cout << "Key: " << mpair.first << "\tVal: " << mpair.second << std::endl;
}
// class member static
std::cout << "CLASS MEMBER STATIC EXAMPLE:" << std::endl;
for(auto mpair : C::versionMap)
{
std::cout << "Key: " << mpair.first << "\tVal: " << mpair.second << std::endl;
}
return 0;
}
Гист