【问题标题】:Friend declaration specifying a default argument must be a definition指定默认参数的朋友声明必须是定义
【发布时间】:2025-12-29 15:05:11
【问题描述】:

自从更新到 XCode 5.1 后,我的一个项目的标题中出现了该错误并且无法构建,我已像以前一样将架构更改为 32 位,但仍然是同样的问题。

它所指的代码行是;

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

如果我删除“朋友”并留下“浮动”项目构建,但我不确定它正在做它应该做的事情。

【问题讨论】:

  • 你可能想去掉你问题上的“objective-c”标签,因为它会吸引错误的人……比如我。 :) (你需要一个 C++ 或 Objective-C++ 的人。)
  • 哎呀抱歉 :D 我刚刚删除了它
  • 找到DistBetweenModels 的实现,看看它是否访问了包含friend 声明的类的任何私有或受保护成员。如果没有,您可以将其完全删除。

标签: c++ objective-c++ xcode5.1


【解决方案1】:

如果我删除“朋友”并留下“浮动”项目构建,但我不确定它正在做它应该做的事情。

这绝对不是正确的做法。

This 是相关问题。

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

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

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

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

【讨论】: