为什么我的默认参数被忽略

Why are my default parameters being ignored?

本文关键字:参数 我的 默认 为什么      更新时间:2023-10-16

为什么我的默认/可选参数被忽略?

grid_model.h

class GridModel {
public:
        GridModel();
        void PrintGrid(bool);
};

grid_model.cpp

void GridModel::PrintGrid(bool flag = false) {
    // things...
}

grid_model_test.cpp

ns::GridModel* gm = new GridModel();
gm->PrintGrid(true); // works
gm->PrintGrid(); // doesn't work

错误:

grid_model_test.cpp:22:12: error: no matching function for call to ‘ns::GridModel::PrintGrid()’
  gm->PrintGrid();
                 ^
In file included from grid_model_test.cpp:2:0:
grid_model.h:27:7: note: candidate: void ns::GridModel::PrintGrid(bool)
  void PrintGrid(bool);
       ^~~~~~~~~

当我在其他地方使用它们时,它们似乎工作正常。

#include <iostream>
class Thing {
public:
        void Whatever(bool);
};
void Thing::Whatever(bool flag = false) {
        std::cout << "Parameter was: " << flag << std::endl;
}
int main() {
        Thing* thing = new Thing();
        thing->Whatever();
        return 0;
}

默认参数值应作为一个良好的设计实践,而不是在声明中,而不是在实现中:

class GridModel {
public:
        GridModel();
        void PrintGrid(bool flag=false);
};
void GridModel::PrintGrid(bool flag) {
    // things...
}

技术(如在此处所述,http://en.cppreference.com/w/cpp/language/default_arguments(:默认参数必须在呼叫的转换单元中可见。如果将类分开为grid_model.h和grid_model.cpp,则包括grid_model.h的其他任何.cpp(例如grid_model_test.cpp(不会意识到仅在grid_model.cpp中出现的信息。

相关文章: