我正在尝试实现一种具有多重继承的 CRTP(如果我很了解它是什么)。
我的主要目标是有一个统一的方式来访问每个子类的实例列表。
可能问题似乎出在命名空间的使用上。
这是最简单版本的代码: http://ideone.com/rFab5
我真正的问题更类似于: http://ideone.com/U7cAf
我有一个使用 clang++ 的额外警告:
test.cpp:28:63: warning: static data member specialization of 'instances' must originally be declared in namespace 'NS1'; accepted as a C++0x extension [-Wc++0x-extensions]
template <> std::list<NS1::Derived*> NS1::Base<NS1::Derived>::instances;
^
test.cpp:15:34: note: explicitly specialized declaration is here
static std::list<T*> instances;
问题已更新,因为它使用命名空间的行为不同。
问题重新编辑以在 Ideone 上发布代码
最佳答案
问题是您试图错误地定义列表变量。一般来说,您需要为 Base 提供一个定义 - 您不能只为恰好是 Derived 的子类的那一部分定义它,除非它是一个显式特化。
template<typename T> std::list<T*> NS1::Base<T>::instances;
编译没有错误。不需要中间体或任何类似的东西。
关于c++ - CRTP子类和实例列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6313304/