2008-11-06 4 views
1

멤버 초기화 목록에서 개체를 초기화 할 수 없습니다 난 비주얼 스튜디오 2008에서 컴파일 할 때는이 코드를

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

,이 얻을 오류 :

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

"int"오류가 어디에서 발생하는지 이해할 수 없으며, 일하니? 실제로 어떤 종류의 문법 오류가있는 것처럼 느껴지지만 멤버 초기화 목록을 사용하는 방법이 아닌가? 또한, AFAIK, MFC 클래스 CTypedPtrMap에는 인수를 취하는 생성자가 없습니다.

답변

2

CTypedPtrMap 당신 initalization m_calcMap 참조가 있다고 10

진짜 당신이로 실행중인 문제에 디폴트되는 int 인수를 취하는 생성자를 가지고 있다는 사실에서 오는 참조를 바인딩 할 임시 CTypedPtrMap 개체를 기본 설정하려고합니다. 그러나 const 참조 만 임시 객체에 바인딩 할 수 있습니다. 의심의 여지가 오류 메시지는 매우 유익하지 않습니다.

회원이 const 인 경우에도 임시로 바인딩하는 데 문제가있을 수 있습니다. 이 경우, 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을 참조 할 수 없습니다. –

3

int이 어디에서 왔는지 모르겠지만 이니셜 라이저 목록의 모든 참조를 초기화해야합니다. m_calcMap은 참조로 선언되므로 CCalcMap 개체의 일부 인스턴스를 참조하도록 초기화해야합니다. 초기화되지 않은 상태로 둘 수는 없습니다. 참조 된 객체를 생성자에 전달할 수있는 방법이 없거나 객체를 참조하지 않을 필요가있을 가능성이있는 경우 참조 대신 포인터를 사용하십시오.

0

C++ 컴파일러에서 일반적인 유형인데, 유형이 무엇인지 파악하지 못하면 오류 메시지가 울리고 사용자가 'int'를 사용하여 계속 진행할 수 있다고 가정합니다. 더 많은 오류 메시지를 생성하십시오 :-)

생성자의 클래스에있는 모든 참조를 초기화해야합니다. int

0

아, 그래 내 생각이 나는 초기화 목록에 생성자를 실행하여 객체가 항상 구축 할 가질 예정이었다. 특히 Mike B의 대답을 듣고 이제 더 명확 해졌습니다. 이제는 범위를 벗어난 후 생성 된 객체가 즉시 파괴된다는 것을 완벽하게 이해합니다. 그게 내가 처음으로 생각한 적 없어. : S 나는 그것이 기존 객체에 대한 참조로 초기화 됨과 함께 참조가 괜찮다고 생각했습니다.

관련 문제