我有这段代码:
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
没有构造函数参与。
答案 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我认为引用是可以的,并且通过引用现有对象来初始化它。