Объявление друга, указывающее аргумент по умолчанию, должно быть определением

Поскольку при обновлении до XCode 5.1 один из моих проектов теперь имеет эту ошибку в заголовке и не будет собираться, я изменил архитектуру на 32-битную, как и раньше, но проблема все та же.

Строка кода, на которую она ссылается, есть;

friend float
DistBetweenModels (ShapeModel* pModel1, ShapeModel* pModel2,
enEvalType nEvalType = ET_EyeDist, enDistType nDistType = DT_Max);

Если я удаляю «друга» и оставляю «поплавок», который создает проект, но я не уверен, что он делает то, что должен.

4

Решение

Если я удаляю «друга» и оставляю «поплавок», который создает проект, но я не уверен, что он делает то, что должен.

Это определенно не правильная вещь.

это это актуальный вопрос.

Объявление друга с параметрами по умолчанию также должно быть определением.

Так что у вас есть выбор, как это исправить. Вы можете переместить определение этой функции в объявление друга:

friend float
DistBetweenModels (ShapeModel* pModel1, ShapeModel* pModel2,
enEvalType nEvalType = ET_EyeDist, enDistType nDistType = DT_Max)
{
// function definition goes here
}

Или вы можете удалить аргументы по умолчанию в объявлении друга:

friend float
DistBetweenModels (ShapeModel* pModel1, ShapeModel* pModel2,
enEvalType nEvalType, enDistType nDistType);

Но вы должны убедиться, что в области имен этой функции есть более раннее объявление, не являющееся другом, которое включает аргументы по умолчанию.

Я бы выбрал второе решение; определение функции вне класса и перемещение туда аргументов по умолчанию. Это потому, что есть некоторые тонкости с поиском имен для дружественных функций, которые определены в строке. Встроенные дружественные функции должны использоваться только для функций, которые, как ожидается, будут вызываться через ADL (например, перегрузки операторов).

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

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]