Reputation: 13140
I cannot make the following piece of code with Explicit Template Instantiation compile.
I get an error on this line:
std::map<uint8_t, std::string> DW_enumDescription::descMap = std::map<uint8_t, std::string>
With clang, the error is:
error: no member named 'descMap' in 'O::Data::DW_enumDescription'
With G++ it is:
error: ISO C++ does not permit 'O::Data::EnumDescription::descMap' to be defined as 'O::Data::DW_enumDescription::descMap' [-fpermissive]
Here I keep using the same namespace Data
, even in my original code I used two separate namespaces; however I get the same error, even with this simplification.
#include <cstdint>
#include <map>
#include <string>
namespace O
{
namespace Data
{
template<typename E /* enum to describe */
,typename T = uint8_t /* index type */
>
class EnumDescription
{
public:
/// Static map to store the descriptions
static std::map<T, std::string> descMap;
};
}
}
namespace O
{
namespace Data
{
enum struct DW : uint8_t
{
DW_Unknown = 0,
DW_TS_1 = 1,
DW_TS_2 = 2,
DW_DS_1 = 3,
DW_Dev = 4,
enumSize = 5
};
class DW_enumDescription : public Data::EnumDescription<DW, uint8_t> {};
}
}
// ===================== Explicit Template Instantiation ======================
namespace O
{
template class Data::EnumDescription<Data::DW, uint8_t>;
}
// ============================================================================
namespace O
{
namespace Data
{
std::map<uint8_t, std::string> DW_enumDescription::descMap = std::map<uint8_t, std::string> // ERROR
{
{ static_cast<uint8_t>(DW::DW_Unknown), "Unknown" },
{ static_cast<uint8_t>(DW::DW_TS_1), "DW_TS_1" },
{ static_cast<uint8_t>(DW::DW_TS_2), "DW_TS_2" },
{ static_cast<uint8_t>(DW::DW_DS_1), "DW_DS_1" },
{ static_cast<uint8_t>(DW::DW_Dev), "DW_Dev" },
};
}
}
Upvotes: 0
Views: 95
Reputation: 136208
descMap
is a member of EnumDescription<DW, uint8_t>
, hence, the fix:
namespace O
{
namespace Data
{
template<> std::map<uint8_t, std::string> EnumDescription<DW, uint8_t>::descMap =
{
{ static_cast<uint8_t>(DW::DW_Unknown), "Unknown" },
{ static_cast<uint8_t>(DW::DW_TS_1), "DW_TS_1" },
{ static_cast<uint8_t>(DW::DW_TS_2), "DW_TS_2" },
{ static_cast<uint8_t>(DW::DW_DS_1), "DW_DS_1" },
{ static_cast<uint8_t>(DW::DW_Dev), "DW_Dev" },
};
}
}
Upvotes: 4