【发布时间】:2011-10-17 16:50:28
【问题描述】:
为什么the Visual C++ compiler refuse to compile this code?
我显然知道错误是:
错误 C2864:
Singleton<T>::p:
只能在类中初始化静态 const 整数数据成员
但是为什么? (即,是否有技术原因不允许这样做?)
这是特定于编译器的行为还是标准规定的?
在全局范围内似乎很好,那么为什么不在类范围内呢?
也好像是not all compilers mind this。
另外,解决这个问题的正确方法是什么?
template<typename T>
struct Singleton
{
static T *p = 0; // Error C2864
static T *getInstance() { /*...*/ return p; }
};
【问题讨论】:
-
这个特殊规则被引入到语言中的唯一目的是让愚蠢的 Singleton 类更难编写。如果你认为你需要一个 Singleton,那么 99% 的情况你都错了。
-
@FredOverflow:等一下,说真的?!那么,当您知道静态函数的输出在程序的生命周期内不能更改时,如何缓存它?
-
@Mehrdad:可能是函数范围的静态变量。或者在 C++11 中,也许你可以在编译时使用
constexpr来计算它。这和单例有什么关系? -
@Mehrdad 不要告诉我你正在上
cached_output_of_f_singleton课程。对于如此简单的事情,这听起来需要做很多工作。 -
ideone 上的示例可以编译,因为您从不实例化模板。如果这样做,或者将
Singleton设为非模板类,您将得到同样的错误。
标签: c++ visual-c++ singleton static-members