C++ GNU g+中的endl编译重载问题+;4.9.2
在使用GNU g++4.9.2(用于在g++2.95.3中编译ok)时,我在编译以下代码段时遇到问题C++ GNU g+中的endl编译重载问题+;4.9.2,c++,c++11,g++,ostream,endl,C++,C++11,G++,Ostream,Endl,在使用GNU g++4.9.2(用于在g++2.95.3中编译ok)时,我在编译以下代码段时遇到问题 XOStream&operator是一个函数模板,您需要指定模板参数。因为您正在使用(即basic_ostream)您可以 if (f == endl<char, std::char_traits<char>>) if(f==endl) 是函数模板,您需要指定模板参数。因为您正在使用(即basic_ostream)您可以 if (f == endl<char, s
XOStream&operator是一个函数模板,您需要指定模板参数。因为您正在使用(即basic_ostream
)您可以
if (f == endl<char, std::char_traits<char>>)
if(f==endl)
是函数模板,您需要指定模板参数。因为您正在使用(即basic_ostream
)您可以
if (f == endl<char, std::char_traits<char>>)
if(f==endl)
使用静态模式选择std::endl
的重载:
#include <iostream>
#include <iomanip>
inline bool is_endl(std::ostream &(*f)(std::ostream &)) {
// return (f == static_cast<std::ostream &(*)(std::ostream &)>(std::endl));
// Even nicer (Thanks M.M)
return (f == static_cast<decltype(f)>(std::endl));
}
int main()
{
std::cout << std::boolalpha;
std::cout << is_endl(std::endl) << '\n';
std::cout << is_endl(std::flush) << '\n';
}
#包括
#包括
内联bool是_endl(std::ostream&(*f)(std::ostream&)){
//返回(f==静态_转换(std::endl));
//更好(谢谢M.M.)
返回(f==静态_转换(std::endl));
}
int main()
{
std::cout使用静态\u cast
选择std::endl
的重载:
#include <iostream>
#include <iomanip>
inline bool is_endl(std::ostream &(*f)(std::ostream &)) {
// return (f == static_cast<std::ostream &(*)(std::ostream &)>(std::endl));
// Even nicer (Thanks M.M)
return (f == static_cast<decltype(f)>(std::endl));
}
int main()
{
std::cout << std::boolalpha;
std::cout << is_endl(std::endl) << '\n';
std::cout << is_endl(std::flush) << '\n';
}
#包括
#包括
内联bool是_endl(std::ostream&(*f)(std::ostream&)){
//返回(f==静态_转换(std::endl));
//更好(谢谢M.M.)
返回(f==静态_转换(std::endl));
}
int main()
{
std::cout或static\u cast
或static\u cast
注意:为避免遇到此类问题,您可以编写XOStreamBuffer并将其附加到XOStream(几乎不变的ostream)那么,你为什么不让endl
做它的事情呢?因为你想在XOStream
级别而不是ostr
级别截取flush
?你还可以将else
简化为返回f(ostr)
直接…我想如果它也在进行类似的黑客攻击,那就行不通了。注意:为了避免遇到这种问题,您可以编写一个XOStreamBuffer并将其附加到XOStream(几乎是一个不变的ostream)那么,你为什么不让endl
做它自己的事情呢?因为你想在XOStream
级别而不是ostr
级别截取flush
?你还可以简化else
以直接返回f(ostr);
我想如果它也在做类似的攻击,那就行不通了。