Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++ 简单I/O操纵器未按预期工作_C++_Io - Fatal编程技术网

C++ 简单I/O操纵器未按预期工作

C++ 简单I/O操纵器未按预期工作,c++,io,C++,Io,以下代码: #include <iostream> std::ios_base &my_manip (std::basic_ios<char> &os) { os.unsetf(std::ios_base::basefield); os.setf(std::ios_base::scientific); return os; } int main (int argc, char **argv) { std::cout &l

以下代码:

#include <iostream>

std::ios_base &my_manip (std::basic_ios<char> &os) {
    os.unsetf(std::ios_base::basefield);
    os.setf(std::ios_base::scientific);
    return os;
}

int main (int argc, char **argv) {
    std::cout << 8.8888888 << std::endl;
    std::cout << my_manip << 8.8888888 << std::endl;
    return 0;
}
#include <iostream>

std::ios_base &my_manip (std::basic_ios<char> &os) {
    os.unsetf(std::ios_base::basefield);
    os.setf(std::ios_base::scientific);
    return os;
}

int main (int argc, char **argv) {
    std::cout << 8.8888888 << std::endl;
    my_manip(std::cout);
    std::cout << 8.8888888 << std::endl;
    return 0;
}
而以下代码:

#include <iostream>

std::ios_base &my_manip (std::basic_ios<char> &os) {
    os.unsetf(std::ios_base::basefield);
    os.setf(std::ios_base::scientific);
    return os;
}

int main (int argc, char **argv) {
    std::cout << 8.8888888 << std::endl;
    std::cout << my_manip << 8.8888888 << std::endl;
    return 0;
}
#include <iostream>

std::ios_base &my_manip (std::basic_ios<char> &os) {
    os.unsetf(std::ios_base::basefield);
    os.setf(std::ios_base::scientific);
    return os;
}

int main (int argc, char **argv) {
    std::cout << 8.8888888 << std::endl;
    my_manip(std::cout);
    std::cout << 8.8888888 << std::endl;
    return 0;
}

有谁能告诉我第一个版本有什么问题吗?

问题似乎是操纵器的签名。如果你把它改成

std::basic_ostream<char> &my_manip (std::basic_ostream<char> &os)
std::basic_ostream&my_manip(std::basic_ostream&os)

然后,它将按预期工作。

自定义操纵器签名不匹配

您应该这样做:

std::ostream& my_manip (std::ostream &os) {
    os.unsetf(std::ios_base::basefield);
    os.setf(std::ios_base::scientific);
    return os;
}

std::cout << my_manip << 8.8888888 << std::endl;
std::ostream&my_manip(std::ostream&os){
os.unset(std::ios_base::basefield);
setf(std::ios_base::scientific);
返回操作系统;
}

std::cout有三个重载获取可用于操纵器的函数指针。这三个签名是

std::ios_base&                  (*)(std::ios_base&)
std::basic_ios<cT, Traits>&     (*)(std::basic_ios<cT, Traits>&);
std::basic_ostream<cT, Traits>& (*)(std::basic_ostream<cT, Traits>&);
std::ios\u base&(*)(std::ios\u base&)
std::basic_ios&(*)(std::basic_ios&);
std::basic_ostream&(*)(std::basic_ostream&);
您使用的签名(
std::ios_base&(*)(std::basic_ios&)
)不是这些签名


我假设您使用实际设置作为示例,因为
std::scientific
操纵器已经实现了示例代码尝试实现的逻辑。

basic\u ostream
具有函数指针的重载。你函数的签名与这些签名中的任何一个都不匹配。我预计会出现编译器错误。你知道为什么没有吗?@jrok:函数指针转换为
bool
,因为类型
std::ios\u base&(*)(std::basic\u ios&)
没有匹配的输出运算符,所以函数指针转换为
bool
(实际上
true
),因为
bool
有一个输出运算符。值
true
打印为
1
(如果您希望看到它打印为
true
,请使用
std::boolalpha
)。啊,是的,我忽略了1。谢谢