全部,如何統一定義所有C++ IOStream機器人的插入算子?
爲什麼下面的代碼無法編譯爲'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: In function ‘int main(int, char**)’: test_overloaded_insertion_manipulators.cpp:60: error: no match for ‘operator<<’ in ‘my_stream << std::endl’
我期望的代碼實例化 '運營商< <' 的標準:: ENDL,就像它沒有爲基元,標準: :ios_base和我的自定義操縱器。
對於上下文,我試圖創建一個輕型API IOStream類的類與當前IOStream操縱器,以及一個或兩個更多的自定義操縱器。
你確定它不會是更實用,只是從公開'ostringstream'繼承?您仍然可以添加自定義功能,但不需要費心去獲取stringstream本身已可以執行的操作。 – leftaroundabout 2011-05-18 23:21:29
@leftaroundabout:大多數STL對象並不是真正被設計成可以從「std :: ostringstream」派生出來的,但似乎至少有一個虛擬析構函數,因此可以工作。 – AJG85 2011-05-18 23:40:53
@leftaroundabout是的,我確定。這是一個玩具示例來調試我目前的問題。我想要的代碼必須攔截每個插入操作,並有條件地執行操作;所以我必須重新實施'運營商''對我的新班級。 – 2011-05-19 02:21:50