【发布时间】:2011-08-28 10:55:55
【问题描述】:
全部,
为什么下面的代码无法为 'std::endl' 编译,但对于所有其他插入的类型都可以?
#include <sstream> // ostringstream
/// @brief A class that does streamed, formatted output via 'operator<<'.
class My_Stream
{
public:
/// @brief A member method that manipulates the underlying stream.
void foo()
{
m_oss << "foo_was_here; ";
}
private:
/// @brief The underlying stream.
std::ostringstream m_oss;
/// @brief 'operator<<' is a friend.
template< typename T >
friend My_Stream& operator<<( My_Stream& a_r_my_stream,
const T& a_r_value );
};
/// @brief A manipulator that calls a class method.
My_Stream& manipulator_foo( My_Stream& a_r_my_stream )
{
a_r_my_stream.foo();
return a_r_my_stream;
}
/// @brief The generic insertion operator.
template< typename T >
My_Stream& operator<<( My_Stream& a_r_my_stream,
const T& a_r_value )
{
a_r_my_stream.m_oss << a_r_value;
return a_r_my_stream;
}
/// @brief Define an iostream-like manipulator for my-stream.
typedef My_Stream& ( * my_stream_manipulator ) ( My_Stream& );
/// @brief The specialized 'my_stream_manipulator' insertion operator.
template<>
My_Stream& operator<<( My_Stream& a_r_my_stream,
const my_stream_manipulator& a_r_manipulator )
{
return a_r_manipulator( a_r_my_stream );
}
int main( int argc, char* argv[] )
{
My_Stream my_stream;
my_stream << 'c'; // char
my_stream << "string"; // c-string
my_stream << 1u; // unsigned int
my_stream << -1; // signed int
my_stream << 5.3f; // float
my_stream << -23.345; // double
my_stream << std::boolalpha; // std::ios_base manipulator
my_stream << std::endl; // std::ostream manipulator
my_stream << manipulator_foo; // my_stream manipulator
return 0;
}
我收到以下 G++ 4.5 错误:
willo:~/test_cpp$ g++ -Wall test_overloaded_insertion_manipulators.cpp test_overloaded_insertion_manipulators.cpp:在函数“int main(int, char**)”中: test_overloaded_insertion_manipulators.cpp:60: error: no match for ‘operator
我希望代码为 std::endl 实例化一个“运算符
对于上下文,我正在尝试创建一个与当前 IOStream 操纵器以及一两个更多自定义操纵器一起使用的轻量级 API IOStream 类。
【问题讨论】:
-
你确定公开继承
ostringstream不是更实用吗?您仍然可以添加自定义功能,但不需要费心去获取 stringstream 本身已经可以做的事情。 -
@leftaroundabout:大多数 STL 对象并非真正设计为派生自
std::ostringstream,但似乎至少有一个虚拟析构函数,因此它可能会起作用。 -
@leftaroundabout 是的,我确定。这是一个调试我当前问题的玩具示例。我的预期代码必须拦截每个插入操作,并有条件地做事;所以我必须针对我的新课程重新实现'operator
标签: c++ operator-overloading iostream manipulators