【问题标题】:can't declare method in class (c++_ [closed]不能在类中声明方法(c++_ [关闭]
【发布时间】:2023-04-09 15:41:01
【问题描述】:

在我的头文件中我声明了结构

    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}'"

我该如何解决?

【问题讨论】:

  • 具有默认值的参数必须全部出现在参数列表的末尾。
  • 不要在C++ 中使用typedef struct ... name。就做struct name
  • 不相关:以下划线后跟大写字母开头的标识符是实现保留的,您不能在代码中使用它们。

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


【解决方案1】:

所有带默认值的参数都应该在列表的end,所以你需要这样的东西:

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

【讨论】:

    【解决方案2】:

    添加到 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 的名字。

    【讨论】:

      猜你喜欢
      • 2021-07-08
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多