在我的头文件中声明结构
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}'“
我该如何解决?
答案 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的名称。