【发布时间】:2021-10-21 07:30:22
【问题描述】:
在一个大型 C++ 代码库中,最初是 @ 2001 编写的,一个 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++, 我今天似乎无法理解这一点。
谁能解释一下为什么会发生这个错误以及如何避免它?
应 S.M. & 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
【问题讨论】:
-
Singleton <T>->Singleton<T>? -
可能是解析问题。如果删除名称和参数之间的空格并具有
T * Singleton<T>::_instance = 0,错误会消失吗? -
请发帖minimal reproducible example。你已经有了:tmp/ts.cpp:11,文件好像很小。
-
我们无法帮助您调试与您展示的代码不同的代码。请编辑此内容以获得minimal reproducible example。
-
如果你想对所有专业进行相同的初始化,为什么要搞乱一个宏呢?只需在类模板下定义
template<class T> T* Singleton<T>::_instance = NULL;,GCC 就会对其进行排序。