C++中如何正确声明带默认参数值的函数?
C++函数默认参数的正确写法
在C++中,函数的默认参数规则是:默认参数只能在函数声明中指定一次,不能同时在声明和定义中重复设置。
你遇到的第一个错误:
Error C2572 'sum': redefinition of default argument: parameter 1
这是因为在函数声明和定义里都给skip_value设置了默认值100,属于重复定义默认参数。
修改后又出现第二个错误:
Error C2660 'sum': function does not take 1 arguments
原因是你去掉了声明里的默认参数,但定义里的默认参数对编译器的调用阶段不可见——编译器在编译main函数时,只会参考函数声明,此时它认为sum需要两个参数,所以你传一个参数就会报错。
正确写法
只在函数声明中指定默认参数,定义中省略默认参数即可:
import <print>; import <vector>; import <optional>; // 声明中指定默认参数 std::optional<int> sum(std::vector<int> nums, int skip_value = 100); int main() { std::vector<int> nums { 10, 20, 30, 100 }; std::optional<int> result = sum(nums); // 此时可以只传一个参数,使用默认值100 if (result.has_value()) { std::println("sum = {}", result.value()); } else { std::println("no results were found"); } } // 定义中不再写默认参数 std::optional<int> sum(std::vector<int> nums, int skip_value) { int result { 0 }; for (const auto& num : nums) { if (num != skip_value) result += num; } if (result == 0) { return { }; } else { return result; } }
补充场景
如果你的代码没有单独的函数声明(比如函数定义写在main函数之前),那可以直接在定义中指定默认参数,这种情况是允许的:
import <print>; import <vector>; import <optional>; // 直接在定义中指定默认参数,无需单独声明 std::optional<int> sum(std::vector<int> nums, int skip_value = 100) { int result { 0 }; for (const auto& num : nums) { if (num != skip_value) result += num; } if (result == 0) { return { }; } else { return result; } } int main() { std::vector<int> nums { 10, 20, 30, 100 }; std::optional<int> result = sum(nums); if (result.has_value()) { std::println("sum = {}", result.value()); } else { std::println("no results were found"); } }
内容的提问来源于stack exchange,提问作者JohnyL
相关产品推荐
相关产品推荐

