c++ - C++98模板类静态成员初始化?
问题描述
在最初于 2001 年编写的大型 C++ 代码库中,大量使用了 Singleton 类,其定义如下:
template <class T>
struct Singleton
{ T *Instance() { return _instance; }
...
static T *_instance;
};
#define INIT_SINGLETON(T) \
T * Singleton <T>::_instance = ((T*)0UL)
现在,使用我必须使用的 GCC 4.7.7,使用默认的 c++98 标准,并在测试文件中使用 INIT_SINGLETON(structX),我得到:
$ g++ -std=c++98 -c /tmp/ts.cpp
/tmp/ts.cpp:11: error: too few template-parameter-lists
代码最后在 Linux RHEL3 上使用 GCC 3.4.3 编译成功 - 我正在尝试将其移植到 RHEL6 (GCC 4.4.4 / 4.7.7)。
自从我使用 C++98 代码以来已经有一段时间了,虽然我从 @ 1994 开始使用 C++,但今天我似乎无法理解这个问题。
谁能解释一下为什么会发生这个错误以及如何避免它?
应 SM 和 NathanOliver 的要求,这是 /tmp/ts.cpp:
template <class T>
struct Singleton
{ T * Instance() { return _instance; }
T * _instance;
};
struct ab_s { int a, b; };
typedef Singleton<ab_s> S_ab_s_t;
ab_s* f(S_ab_s_t sa)
{ return sa.Instance();
}
ab_s * Singleton<ab_s> :: _instance = NULL;
GCC 4.7.7 给出错误:
$ g++ -std=c++98 -Isonim/MRFP/inc -c /tmp/ts.cpp
/tmp/ts.cpp:15: error: too few template-parameter-lists
解决方案
模板特化需要模板<>。
#define INIT_SINGLETON(T) \
template<> \
T * Singleton<T>::_instance = ((T*)0UL)
编译示例
template <class T>
struct Singleton
{
T *Instance() { return _instance; }
static T *_instance;
};
#define INIT_SINGLETON(T) \
template<> \
T * Singleton<T>::_instance = ((T*)0UL)
struct structX{};
INIT_SINGLETON(structX);
对于更新的问题:
template<>
ab_s * Singleton<ab_s> :: _instance = NULL;
推荐阅读
- laravel - 在 Laravel 中使用 2 个输入文件上传多个图像文件
- linux - 下载 zip 文件后,如何在 ubuntu 中设置 opera 驱动程序或任何其他驱动程序?
- c# - 当订阅者无法调用包含事件的方法时,C#发布事件
- javascript - 在 RxJS 中处理并行嵌套的 observables
- python - 为什么QWidget在继承时表现不同
- laravel - app() 中存在 Laravel 包别名,但仍然找不到类
- c# - NLog内部记录器的编程配置
- c# - 如何在数组之间分离和移动非负值和正值?
- r - 数字/文本作为输出并根据逻辑更改数字/文本的颜色
- javascript - 下载关闭受保护视图的 Excel VueJS