Не удается инициализировать объект в списке инициализации члена - PullRequest
1 голос
/ 06 ноября 2008

У меня есть этот код:

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 ]

3 голосов
/ 06 ноября 2008

Я не уверен, откуда он получает int, но вы должны инициализировать все ссылки в списке инициализаторов. m_calcMap объявлен как ссылка, и поэтому он должен быть инициализирован для ссылки на некоторый экземпляр объекта CCalcMap - вы не можете оставить его неинициализированным. Если у вас нет возможности передать указанный объект в конструктор или есть вероятность, что он не нужен для ссылки на объект, используйте указатель вместо ссылки.

2 голосов
/ 06 ноября 2008

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
2 голосов
/ 06 ноября 2008

Если я что-то упускаю, так как это ссылка, ее нужно инициализировать, чтобы указать на что-то. Ссылочные переменные по определению не могут быть инициализированы в NULL.

Что касается int, я не знаю, почему он так говорит.

0 голосов
/ 07 ноября 2008

Ах, да, моя идея состояла в том, что я намеревался запустить его конструктор в списке инициализатора, и таким образом, объект должен создаваться постоянно. Это становится более ясным теперь, особенно после ответа Майка Б., и теперь имеет смысл, что построенный объект будет немедленно разрушен после выхода из области видимости. Это то, что я никогда не рассматривал первым. : S Я думал, что все в порядке со ссылками, наряду с инициализацией его ссылкой на существующий объект.

0 голосов
/ 06 ноября 2008

Это обычный MO для компиляторов C ++, когда они не могут понять, что такое тип, выплевывать сообщение об ошибке и предполагать, что пользователь имел в виду «int», чтобы иметь возможность продолжить (... и генерировать еще больше сообщений об ошибках; -)

Однако вам нужно инициализировать все ссылки в классе в ваших конструкторах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...