我可以使用std :: set <std :: string>作为函数的默认参数吗?</std :: string>

时间:2012-02-04 01:15:23

标签: c++

我是新手,现在确定这是否可行。我想在函数中添加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> &'"

有人可以帮我吗?

由于

4 个答案:

答案 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>()