【问题标题】:The correct way to define default argument for a friend function in C++在 C++ 中为友元函数定义默认参数的正确方法
【发布时间】:2014-06-13 13:52:28
【问题描述】:

我想给好友函数指定一个默认值,如下:

friend Matrix rot90 (const Matrix& a, int k = 1);

使用 Xcode 5.1.1 编译此行时,出现以下错误

./Matrix.hh:156:19: error: friend declaration specifying a default argument must be a definition

修复它的正确方法是什么?

谢谢!

【问题讨论】:

  • 错误说明一切,你必须定义函数,而不仅仅是声明
  • @BЈовић 谢谢。第二次尝试。或者使用两个函数,friend Matrix rot90 (const Matrix&); 和 friend Matrix rot90 (const Matrix&, int);。
  • 更新:正如 Rakibul Hasan 建议的那样,定义函数而不是仅仅声明它可以解决问题。

标签: c++ c++11 xcode5


【解决方案1】:

标准说(§8.3.6):

如果友元声明指定了默认参数表达式,则 声明应是一个定义,并且应是唯一的声明 翻译单元中的函数或函数模板。

也就是说,如果您在 friend 声明中指定默认参数,您还必须在当时和那里定义函数。如果您不想这样做,请删除那里的默认参数并为指定默认参数的函数添加单独的声明。

// forward declarations:
class Matrix;
Matrix rot90 (const Matrix& a, int k = 1);

class Matrix {
    friend Matrix rot90 (const Matrix&, int); //no default values here
};

【讨论】:

  • 谢谢,这解决了它并且比添加定义更优雅。附加问题:该类是在头文件中定义的。前向声明是否也应该出现在这个头文件中?
  • @Anastasia 它不必是同一个头文件,也可以是你的类头引入的另一个头文件。但最后,一旦所有的包含都解决了,你应该以上面的顺序结束,每个.cpp 文件首先看到独立声明,然后是朋友声明。
猜你喜欢
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
相关资源
最近更新 更多