7

由于更新到 XCode 5.1,我的一个项目现在在标题中有该错误并且不会构建,我已经像以前一样将架构更改为 32 位,但仍然是同样的问题。

它所指的代码行是;

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

如果我删除“朋友”并离开“浮动”项目,但我不相信它正在做它应该做的事情。

4

1 回答 1

12

如果我删除“朋友”并离开“浮动”项目,但我不相信它正在做它应该做的事情。

这绝对不是正确的做法。

是相关的问题。

带有默认参数的友元声明也必须是定义。

所以你有一些选择来解决这个问题。您可以将此函数的定义移动到朋友声明中:

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 调用的函数(例如运算符重载)。

这假设该函数确实需要成为朋友。如果没有,那么您可以删除此朋友声明。

于 2014-06-03T22:08:56.900 回答