C++ 我可以使用std::set<;标准::字符串>;作为函数的默认参数?

C++ 我可以使用std::set<;标准::字符串>;作为函数的默认参数?,c++,C++,我是新手,现在确定这是否可行。我想在函数中添加一个参数std::set,并将其默认值设置为NULL,以避免影响以前的使用 所以基本上 func(int a); turns into func(int a, std::set<std::string> & temp = NULL); func(inta);变成 func(int a,std::set&temp=NULL); 但这将给我一个错误“error C2440:'默认参数”:无法从'int'转换为'std::set

我是新手,现在确定这是否可行。我想在函数中添加一个参数
std::set
,并将其默认值设置为
NULL
,以避免影响以前的使用

所以基本上

func(int a); turns into  
func(int a, std::set<std::string> & temp = NULL);
func(inta);变成
func(int a,std::set&temp=NULL);
但这将给我一个错误
“error C2440:'默认参数”:无法从'int'转换为'std::set&'”

有人能帮我吗


谢谢

以下内容将为您提供一个空的
集合
对象:

std::set<std::string>()
std::set()

以下内容将为您提供一个空的
集合
对象:

std::set<std::string>()
std::set()

要将默认值设置为
NULL
,必须传递一个
std::set*
,而不是对值类型的引用


此外,如果要传递一个非指针类型,并且希望分配任何默认值,那么它必须是
const
引用,因为您不能(明智地!)将临时值分配给它

因此,您对“默认”值的选择基本上是:

std::set<std::string>* = NULL

看起来你已经走上了第三种选择的轨道。只需编写两个定义,一个带参数,一个不带参数。

要将默认值设置为
NULL
,必须传递
std::set*
,而不是对值类型的引用


此外,如果要传递一个非指针类型,并且希望分配任何默认值,那么它必须是
const
引用,因为您不能(明智地!)将临时值分配给它

因此,您对“默认”值的选择基本上是:

std::set<std::string>* = NULL

看起来你已经走上了第三种选择的轨道。你只需要写两个定义,一个有一个,没有一个参数。

你不能在C++中有<代码> null < /c>引用。 最简单的方法是将一个伪空
集设置为

std::set<std::string> empty;
void func(int a, std::set<std::string>& temp = empty)
{
    // ...
}
更简洁的方法是使用函数重载创建一个包装器,这样您就不需要默认设置:

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);

C++中不能有<代码> null <代码>引用。< /p> 最简单的方法是将一个伪空
集设置为

std::set<std::string> empty;
void func(int a, std::set<std::string>& temp = empty)
{
    // ...
}
更简洁的方法是使用函数重载创建一个包装器,这样您就不需要默认设置:

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);

你有正确的想法-使用参考资料。但是,引用在默认情况下不能为NULL,就像指针一样。因此,您可能需要重载函数,以便在不希望将集合作为参数传递时使用
void func(int a)
并使用
void func(int a,std::set&temp)

这样,您实际上可以提供两个独立的实现—一个在集合上工作,另一个不工作。从使用角度来看,它将具有与默认参数相同的效果。从编码的角度来看,每个实现都有一个更明确的目的

如果您不打算修改集合,我是否可以建议改为使用常量引用:

void func( int a, const std::set<std::string>& temp )
void func(int a,const std::set&temp)

您有正确的想法-使用参考资料。但是,引用在默认情况下不能为NULL,就像指针一样。因此,您可能需要重载函数,以便在不希望将集合作为参数传递时使用
void func(int a)
并使用
void func(int a,std::set&temp)

这样,您实际上可以提供两个独立的实现—一个在集合上工作,另一个不工作。从使用角度来看,它将具有与默认参数相同的效果。从编码的角度来看,每个实现都有一个更明确的目的

如果您不打算修改集合,我是否可以建议改为使用常量引用:

void func( int a, const std::set<std::string>& temp )
void func(int a,const std::set&temp)

我不确定您是否可以引用
NULL
。(与指针相反)我不确定您是否可以引用
NULL
。(与指针相反)谢谢,我在prototype和定义中都更改了它,但是现在定义行将给出“错误C2572:**默认参数的重新定义:”不要在定义中使用它,只在prototype中使用它谢谢,我在prototype和定义中都更改了它,但是现在定义行将给出我“错误C2572:**重新定义默认参数:“不要在定义中使用它,只有在原型+1中也值得一提,您可以将默认参数用于常量集。
void func(int a,std::set const&temp=std::set())
谢谢@LokiAstari。在你的评论之后,我增强了我的回答。如果你要修改
temp
,那么
std::set&temp=empty
可能不是个好主意。你可以修改
empty
(通过
temp
),这将使
empty
实际上不再是空的。此外,对
empty
的任何修改都不会是线程安全的。+1还值得一提的是,您可以对常量集使用默认参数。
void func(int a,std::set const&temp=std::set())
谢谢@LokiAstari。在你的评论之后,我增强了我的回答。如果你要修改
temp
,那么
std::set&temp=empty
可能不是个好主意。你可以修改
empty
(通过
temp
),这将使
empty
实际上不再是空的。此外,对
empty
的任何修改都不会是线程安全的。“它必须是
常量
引用”:标准是否规定了这一点?@user946850-是的,因为左值引用不能绑定到临时对象,因为它们不是左值。”它必须是一个
const
reference”:标准是否规定了这一点?@user946850-是的,因为左值引用不能绑定到临时对象,因为它们不是左值。