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。谢谢