c++ - CRTP子类和实例列表

标签 c++ templates namespaces static-members crtp

我正在尝试实现一种具有多重继承的 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;

http://ideone.com/Vclac

编译没有错误。不需要中间体或任何类似的东西。

关于c++ - CRTP子类和实例列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6313304/

相关文章:

.net - .NET 中的 "global::System"和 "System"有什么区别?

c++ - 简单解码程序C++

C++ map<std::string> vs map<char *> 性能(我知道, "again?")

c++ - 使用 gcc 编译的应用程序与使用不同 gcc 版本编译的库不同

c++ - 遍历许多不同类型的队列

c++ - 有人可以纠正我的重载功能做错了什么吗?

c++ - 从缓冲区写入文件时,文件变大一个字符

c++ - 从成员函数指针类型中删除类指针

php - 无法在 Laravel 中使用自定义 PHP 插件

c# - 如何正确地重新映射我的 XAML 命名空间?