c++ - 非模板错误的模板定义

标签 c++ templates generic-programming crtp

我想使用 CRTP pattern结合一些锁定机制以在多线程环境中进行访问同步。

我的代码是这样的:

//-- CRTP base class with some sync/lock mechanism
template<typename T, typename SYNC>
struct Base {
  static std::unordered_map<int, std::string> s_map;
  static SYNC s_sync;
};

//-- derived class using CRTP
template<typename SYNC>
struct ProductX : public Base<ProductX<SYNC>, SYNC> {};

//-- static initialisation
template<typename SYNC>
std::unordered_map<int, std::string> Base<ProductX<SYNC>, SYNC>::s_map {
  { 1, "value_1" },
  { 2, "value_2" }
}

不管怎样

error: template definition of non-template std::unordered_map<int, std::basic_string<char> > Base<ProductX<SYNC>, SYNC>::s_map

编译时。

静态 s_map 引发错误初始化。有人可以指出我做错了什么吗?

最佳答案

您使用 Base<ProductX<SYNC>, SYNC>作为成员特化定义 s_map ,因此您实际上需要 Base 的相应偏特化(§14.5.5.3/1)。换句话说,您正在尝试定义一个不存在的偏特化的成员。

尝试提供该专业:

template<typename SYNC>
struct ProductX;

//-- CRTP base class with some sync/lock mechanism
template<typename T, typename SYNC>
struct Base {};
template<typename SYNC>
struct Base<ProductX<SYNC>, SYNC> {
  static std::unordered_map<int, std::string> s_map;
  static SYNC s_sync;
};

//-- derived class using CRTP
template<typename SYNC>
struct ProductX : public Base<ProductX<SYNC>, SYNC> {};

//-- static initialisation
template<typename SYNC>
std::unordered_map<int, std::string> Base<ProductX<SYNC>, SYNC>::s_map {
  { 1, "value_1" },
  { 2, "value_2" }
};

Demo .

关于c++ - 非模板错误的模板定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31557194/

相关文章:

java - 用于基于 Java 模板的字符串构造的工具

python - 如何测试 Pyramid Chameleon 模板?

javascript - Express EJS 布局 : res. 局部变量未在布局中呈现

dart - Dart中的通用getter/setter?

ios - 如何自动初始化不同类的对象?

c++ - win32 计时器是否由其调用线程拥有?

c++ - 将一个类传递给 sprintf

c++ - C++ XPCOM 组件的测试驱动开发?

c++ - 关于初始化引用指针的问题

c# - 用于组织的 Linq 表达式(类似于 Group By 但不同)