无法在类中声明方法 (C++_

can't declare method in class (c++_

本文关键字:方法 C++ 声明      更新时间:2023-10-16

在我的标题文件中我声明结构

    typedef struct _PreprocessedImage
{
  cv::Rect straight;
  cv::Rect diagonal;
  bool empty = true;
...
...
} PreprocessedImage;

然后我用方法

创建类
std::vector<float> processData(cv::Mat &image, bool drawRegions = false, PreprocessedImage &preproc);
.

尝试编译并获得

"错误:参数3"

缺少默认参数

但是,当我尝试用默认值声明方法时,例如:

 std::vector<float> processData(cv::Mat &image, bool drawRegions = false, PreprocessedImage &preproc = PreprocessedImage());
.

我有

"错误:类型非const参考的初始化无效 '预处理图像&amp;{aka _preprocessedimage&amp;}'来自类型的rvalue 'preprocessedImage {aka _preprocessedimage}'

我该如何修复?

所有带有默认值的参数都应在列表的 end 上,因此您需要以下内容:

std::vector<float> processData(cv::Mat &image, PreprocessedImage &preproc, bool drawRegions = false);
.

添加到paxdiablo的答案中。

是的,默认值参数必须最后一次。您尝试通过给preproc作为默认参数而解决此问题的尝试失败了,因为临时性无法绑定到LVALUE参考(必须是const);此外,给某些东西默认为"为此,"可能不是您想做的。

不需要重新安排现有函数的替代方案是编写转发超载而不是使用默认参数:

std::vector<float> processData(cv::Mat& image, bool drawRegions, PreprocessedImage& preproc)
{
   /* ... */
}
std::vector<float> processData(cv::Mat& image, PreprocessedImage& preproc)
{
   return processData(image, false, preproc);
}

顺便说一句,您不需要(或想要)C 中的古董C风格typedef struct A { ... } B语法(除非您需要直接的C兼容性);您只需要struct B。而且,如果您确实必须去前者,则应选择一个未保留给实施的名称。