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

时间:2018-12-20 11:55:40

标签: c++ c++14 c++17

在我的头文件中声明结构

    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());
.

我知道了

  

“错误:类型的非常量引用的无效初始化   类型的右值中的“ PreprocessedImage&{aka _PreprocessedImage&}”   'PreprocessedImage {aka _PreprocessedImage}'“

我该如何解决?

2 个答案:

答案 0 :(得分:1)

所有具有默认值的参数应位于列表的 end 中,因此您需要类似以下内容:

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

答案 1 :(得分:0)

要添加到paxdiablo的答案中。

是的,默认参数必须排在最后。您也尝试通过给preproc提供默认参数来解决此问题的尝试失败了,因为临时不能绑定到左值引用(必须为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。而且,如果您确实必须使用前者,则应选择一个非reserved to the implementation的名称。