2008-11-06 223 views
1

我有这样的代码:不能在成员初始化列表初始化对象

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没有构造函数参数。

回答

2

int从事实CTypedPtrMap有一个构造函数被默认为10

你正在运行到真正的问题是int论点,即m_calcMap参考initalization你有没有未来试图默认构造一个临时的CTypedPtrMap对象来绑定引用。但是,只有const引用可以绑定到临时对象。毫无疑问,错误消息不是非常丰富。

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

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

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

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

+0

NULL是一个int,不能转换为CCalcMap&。指针可以指向NULL,但引用不能引用NULL。 – 2008-11-06 19:25:18

3

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

0

对于C++编译器来说,当他们无法弄清楚类型是什么时,吐出一条错误消息并假定用户意思是'int'以便能够继续(...并生成更多的错误信息;-)

虽然你确实需要在你的构造函数中初始化类中的所有引用。

0

啊,是我的想法是,我打算来运行其在初始化列表构造,因此具有对象在任何时候都建造。尤其是在Mike B的回复之后,它现在变得更加清晰了,现在非常有意义的是,构建的对象在超出范围后会立即被破坏。这是我从来没有考虑过的第一个。 :S我认为这对引用是可以的,以及对现有对象的引用进行初始化。