Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数中流类参数的默认值_C++_Arguments - Fatal编程技术网

C++ 函数中流类参数的默认值

C++ 函数中流类参数的默认值,c++,arguments,C++,Arguments,我有功能。如果用户未在此函数中提供流元素的: bool isPolpierwsza(int, bool = false, ofstream = NULL); 比我想说“plik” 到NULL值 我的编译器输入错误: 2.9.cpp:5:48:错误:从“长”到“流”(也称为“基本流”)没有可行的转换 bool-isPolpierwsza(int,bool=false,ofstream=NULL) 如何将默认值设置为ofstream,以便将其视为NULL或“false”?首先,使用ostream而

我有功能。如果用户未在此函数中提供流元素的

bool isPolpierwsza(int, bool = false, ofstream = NULL);
比我想说“plik”

NULL

我的编译器输入错误:

2.9.cpp:5:48:错误:从“长”到“流”(也称为“基本流”)没有可行的转换
bool-isPolpierwsza(int,bool=false,ofstream=NULL)


如何将默认值设置为ofstream,以便将其视为
NULL
或“false”?

首先,使用ostream而不是ofstream可能会很有用,因为这是一种更普遍的做法,被认为是更好的做法

然后,您可以简单地分配'cout'而不是'NULL'。NULL不起作用,因为ostream不是指针而是结构。这意味着必须完全填写结构,并且不能将其赋值为NULL。相反,你可以用cout,比如

bool isPolpierwsza(int, bool = false, ostream& = cout);

您可以使用两个重载,其中一个重载不接受
std::ofstream
参数:

bool isPolpierwsza(int liczba, bool wypisz)
{
    return isPolpierwsza(liczba, wypisz, /* your own argument */);
}

您可以改为传递流缓冲区:

bool isPolpierwsza(int, bool = false, std::streambuf* osbuf = nullptr)
{
    std::ostream os(osbuf? osbuf : std::cout.rdbuf());
    os << "yay it works\n";
    return false;
}

或者实际上,没有参数。

这与C有什么关系?用不同的函数重载它。毕竟,它是C++。所以提供两个版本;没有流(首先应该是引用)的流。
of stream
不是指针。不能将其设置为
NULL
NULL
宏很可能被定义为
0L
,因此出现此错误。通常不存在“NULL值”之类的内容。有些类型(例如指针或可选类型)有这样的概念,但大多数类型没有。这甚至不会编译。流不能按值公开复制。最后一个参数需要是一个引用。这将把内容打印到标准输出;我猜OP根本不想打印东西@0x499602D2好吧,这感觉更像是IOStream库设计的精神(我知道,这会伤害很多人的眼睛),如果意图不是在
wypisz=false
时写任何东西,你会用什么作为你自己的论点?与
NULL
类似的东西似乎是正确的……是的,您只需将
NULL
作为第三个参数传递,但我认为
NULL
不能用于流的
@sancho.srestemonicacellio将流的
参数更改为指针。(
ofstream*
)。@sancho.srestestemonicacellio,然后使用if语句检查流的
是否有效:
if(wypisz){…}
。为了使用它,您可以像(
*stream
)一样取消引用它。
bool isPolpierwsza(int, bool = false, std::streambuf* osbuf = nullptr)
{
    std::ostream os(osbuf? osbuf : std::cout.rdbuf());
    os << "yay it works\n";
    return false;
}
std::ofstream ofs("myoutput.txt");
bool result = isPolpierwsza(42, true, ofs.rdbuf());