c++ - 显式模板实例化问题
问题描述
我无法使用显式模板实例化编译以下代码。
我在这一行得到一个错误:
std::map<uint8_t, std::string> DW_enumDescription::descMap = std::map<uint8_t, std::string>
使用clang,错误是:
错误:“O::Data::DW_enumDescription”中没有名为“descMap”的成员
对于 G++,它是:
错误:ISO C++ 不允许将“O::Data::EnumDescription::descMap”定义为“O::Data::DW_enumDescription::descMap”[-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" },
};
}
}
解决方案
descMap
是 的成员EnumDescription<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" },
};
}
}
推荐阅读
- python - 使用相同的 3 行代码打印多行
- firebase - 使用模拟器获取用于单元测试的 Cloud Functions url
- c - 我的程序没有按照应有的方式对齐列 [C 语言]
- haskell - 用字符串元组列表替换字符串
- python - 巨蟒棋盘
- firebase - 恢复已删除的 Firebase 存储规则
- python - python - 将图像保存到生成的目录
- python - aggfunc count 和 len 有什么区别
- rust - Rust 中的链式向量和 IntoIterator 元素
- c# - CookieApplicationOptions LoginPath 何时何地检查重定向?