显式模板实例化问题

Problem with Explicit Template Instantiation

本文关键字:实例化 问题      更新时间:2023-10-16

我无法使用显式模板实例化编译以下代码段。

我在这一行收到一个错误:

std::map<uint8_t, std::string> DW_enumDescription::descMap = std::map<uint8_t, std::string>

使用叮当声,错误是:

错误:在"O::D ata::D W_enumDescription"中没有名为"descMap"的成员

使用 G++ 是:

错误:ISO C++不允许将"O::D ata::EnumDescription::d escMap">

定义为"O::D ata::D W_enumDescription::d escMap" [-fpermissive]

在这里,我继续使用相同的命名空间Data,即使在我的原始代码中,我也使用了两个单独的命名空间;但是即使进行了这种简化,我也得到了相同的错误。

#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"  },
};
}
}

descMapEnumDescription<DW, uint8_t>的成员,因此,修复:

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"  },
};
}
}