代码之家  ›  专栏  ›  技术社区  ›  Prasoon Saurav

初始化模板类成员时出现问题

  •  0
  • Prasoon Saurav  · 技术社区  · 15 年前

    template <typename T>
    
    class TemplateClass
    {
    
        const T constMember;
        public:
    
        TemplateClass()
        {
            constMember = T();
        }
    
    };
    
    int main()
    {
       TemplateClass <int> obj;
    }
    

    error: uninitialized member 'TemplateClass<int>::constMember' with 'const' type 'const int'

    我认为构造函数是用来初始化数据成员的。怎么了????

    2 回复  |  直到 15 年前
        1
  •  11
  •   Prasoon Saurav    15 年前

    您不是在初始化const成员,只是在分配给它。

    成员初始化 can only be done using a member initialization list

    例如:

    TemplateClass() : constMember(T()) //initializes constMember to 0
    {} 
    
        2
  •  4
  •   Community Mohan Dere    9 年前

    a very good answer . 不过,我想补充一点,我无法在评论中表达:

    null 然后用一个真实的对象覆盖它。然而,在C++中,类型有值语义,除非明确地选择(并实现)引用语义。

    T 作为一个昂贵的初始化类型。(对于“昂贵”的任何定义。如果你很难想象这样一种类型,想象一下我们正在谈论的是图形卡驱动程序的代码。对于这样的代码,几乎任何东西都是昂贵的。)因为您可以自由地访问构造函数主体中的对象,所以在执行构造函数主体时需要已经构造了它。否则您将访问原始内存而不是有效对象。(构造是将一个原始内存块转换为有效对象的过程。)

    这当然是胡说八道,这就是为什么我们有初始化列表。使用它们,我们可以指定编译器应该使用哪些构造函数来构造基类和成员子对象。这样,就可以立即使用正确的值创建对象。

    另外,正如您所发现的,初始化列表是初始化某些数据成员(即常量对象、引用和没有可访问的默认构造函数的类型的对象)的唯一方法。