我是新手,现在确定这是否可行。我想在函数中添加std::set<std::string>
的参数,并将其默认值设置为NULL
,以避免对以前的使用产生影响。
基本上,
func(int a); turns into
func(int a, std::set<std::string> & temp = NULL);
但这会给我一个错误"error C2440: 'default argument' : cannot convert from 'int' to 'std::set<_Kty> &'"
有人可以帮我吗?
由于
答案 0 :(得分:5)
要将默认值设置为NULL
,您必须传递std::set<std::string>*
,而不是对值类型的引用。
此外,如果您要传递非指针类型并且想要分配任何默认值,则必须是const
引用,因为您不能(可取的!)给它分配一个临时的。
因此,您对“默认”值的选择基本上是:
std::set<std::string>* = NULL
或:
const std::set<std::string>& = std::set<std::string>()
或选项3,更直接地使用函数重载:
void myfunction() {dothing(0);}
void myfunction(std::set<std::string>& optional_param)
{ dothing(optional_param.size()); }
或选项4,具有相应的bool
,指示参数是否为“set”:
void myfunction(std::set<std::string>& param, bool param_has_meaning=true) {}
看起来你已经在第三个选项的轨道上了。您只需要编写两个定义,一个用于,一个没有参数。
答案 1 :(得分:1)
您无法在C ++中拥有NULL
参考。
最简单的方法是假空set
:
std::set<std::string> empty;
void func(int a, std::set<std::string>& temp = empty)
{
// ...
}
然后你可以打电话:
func(1);
Neater仍然会使用函数重载来创建一个包装器,这样你就不需要默认了:
void func(int a, std::set<std::string>& temp)
{
}
void func(int a)
{
std::set<std::string> empty;
func(a, empty);
}
// And then...
func(1);
所有这些假设如果您传入set
,您将以某种方式修改它。从您的问题中不清楚您的意图是什么,但我已经基于您的参考是非const
做出了假设。如果我算错了,那么答案就更简单了:
void func(int a, const std::set<std::string>& temp = std::set<std::string>())
{
}
答案 2 :(得分:1)
你有正确的想法 - 使用参考。但是,默认情况下,引用不能为NULL,就像指针一样。因此,您可能想要做的是重载函数,以便在不希望将集合作为参数传递并使用void func(int a)
void func( int a, std::set<std::string>& temp)
这样,您实际上可以提供两个单独的实现 - 一个适用于集合,另一个不适用。从使用的角度来看,它与默认参数具有相同的效果。从编码的角度来看,每个实现都有更明确的目的。
如果您不打算修改该集合,我建议您使用const引用:
void func( int a, const std::set<std::string>& temp )
答案 3 :(得分:0)
以下内容将为您提供一个空的set
对象:
std::set<std::string>()