以下示例編譯細,但我不能找出如何分離聲明和操作員< <()的定義是這樣的特定情況。如何在模板類中拆分模板友元函數的定義?
每次我嘗試拆分定義的朋友是造成麻煩和gcc抱怨運營商< <()定義必須採用一個參數。
#include <iostream>
template <typename T>
class Test {
public:
Test(const T& value) : value_(value) {}
template <typename STREAM>
friend STREAM& operator<<(STREAM& os, const Test<T>& rhs) {
os << rhs.value_;
return os;
}
private:
T value_;
};
int main() {
std::cout << Test<int>(5) << std::endl;
}
操作< <()應該有不同類型的輸出流(標準::法院,的std :: wcout或升壓:: ASIO ::知識產權:: TCP的工作自由的第一個參數: :iostream的)。第二個參數應該綁定到周圍類的專用版本。
Test<int> x;
some_other_class y;
std::cout << x; // works
boost::asio::ip::tcp::iostream << x; // works
std::cout << y; // doesn't work
boost::asio::ip::tcp::iostream << y; // works
除此之外使用非成員函數不等同於分裂的定義和聲明,因爲非成員函數不能訪問私有屬性的類。
可能的複製:http://stackoverflow.com/questions/476272/how-to-properly-overload-the-operator-for-an-ostream – Stephen 2010-05-12 15:07:09
爲什麼你想參數化OSTREAM類型?常見的習慣用法是定義operator << as:'std :: ostream&operator <<(std :: ostream&os,Test&rhs){...}' –
2010-05-12 15:46:53
@dribeas:因爲我希望能夠使用其他輸出流也是如此。像boost :: asio :: ip :: tcp :: iostream和boost :: asio :: local :: stream_protocol :: iostream。 – joke 2010-05-12 15:55:28