无法初始化成员初始化列表中的对象

时间:2008-11-06 18:36:50

标签: c++ mfc

我有这段代码:

CCalcArchive::CCalcArchive() : m_calcMap()
{
}

m_calcMap定义如下:

typedef CTypedPtrMap<CMapStringToPtr, CString, CCalculation*> CCalcMap;
CCalcMap& m_calcMap;

当我在Visual Studio 2008中编译时,出现此错误:

error C2440: 'initializing' : cannot convert from 'int' to 'CCalcArchive::CCalcMap &'

我甚至不知道从哪里得到“int”错误,以及为什么这不起作用?感觉我实际上有某种语法错误,但这不是应该如何使用成员初始化列表?此外,AFAIK,MFC类CTypedPtrMap没有构造函数参与。

5 个答案:

答案 0 :(得分:3)

我不知道从哪里获取int,但必须初始化初始化列表中的所有引用。 m_calcMap被声明为引用,因此必须初始化它以引用CCalcMap对象的某个实例 - 您不能将其保留为未初始化。如果您无法将引用的对象传递给构造函数,或者您可能需要它不引用对象,则使用指针而不是引用。

答案 1 :(得分:2)

除非我遗漏了某些东西,因为它是一个参考,它需要被初始化以指向某些东西。根据定义,引用变量不能初始化为NULL。

就int而言,我不知道为什么这么说。

答案 2 :(得分:2)

int来自CTypedPtrMap有一个构造函数,它将int参数默认为10。

您遇到的真正问题是您在那里m_calcMap引用初始化尝试默认构造一个临时CTypedPtrMap对象来绑定引用。但是,只有const引用可以绑定到临时对象。毫无疑问,错误信息的信息量不大。

但即使m_calcMap成员是const引用,您仍然会遇到将其绑定到临时的问题。在这种情况下,MSVC 2008编译器给出了一个非常明确的警告:

mfctest.cpp(72) : warning C4413: '' : reference member is initialized to a temporary 
                                       that doesn't persist after the constructor exits

答案 3 :(得分:0)

这是C ++编译器的常见MO,当他们无法弄清楚类型是什么时,吐出错误消息并假设用户意味着'int'以便能够继续(...和生成更多错误消息; - )

但是,您确实需要在构造函数中初始化类中的所有引用。

答案 4 :(得分:0)

啊,是的,我的想法是我打算在初始化列表中运行它的构造函数,因此始终构造对象。现在,特别是Mike B的回复之后,它变得越来越清晰,现在完全可以理解,在超出范围之后,构造的对象将立即被破坏。这是我从未考虑过的。 :S我认为引用是可以的,并且通过引用现有对象来初始化它。