加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么我们不能有非const类级静态变量?

发布时间:2020-12-16 10:52:53 所属栏目:百科 来源:网络整理
导读:为什么 the Visual C++ compiler refuse to compile this code? 我显然知道错误是: Error C2864: SingletonT::p : Only static const integral data members can be initialized within a class 但为什么? (即技术原因是否有不允许的原因?) 这是特定于编
为什么 the Visual C++ compiler refuse to compile this code?

我显然知道错误是:

Error C2864: Singleton<T>::p:
Only static const integral data members can be initialized within a class

但为什么? (即技术原因是否有不允许的原因?)
这是特定于编译器的行为还是由标准强制执行?
它似乎在全球范围内很好,为什么不在课堂范围内呢?

它似乎也像not all compilers mind this.

另外,解决这个问题的正确方法是什么?

template<typename T>
struct Singleton
{
    static T *p = 0;  // Error C2864

    static T *getInstance() { /*...*/ return p; }
};

解决方法

这是标准行为.只有静态const积分成员才能在没有正确定义的情况下进行初始化.需要在某处定义所有其他类型,并在定义时编写初始化:

template<typename T>
struct Singleton {
    static T *p;

    static T *getInstance() { /*...*/ return p; }
};

template<typename T>
T *Singleton<T>::p = 0;

必须在某处定义对象.如果在类中定义它们,则在头文件中定义它们,并为包含它的每个编译单元获取不同的对象.这对于const整数类型是放宽的,如果你没有定义它们,那么编译器只是用它的文字值替换它.如果没有提供定义,那么取这样的静态const积分的地址仍会导致链接器错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读