Следующий пример компилируется нормально, но я не могу понять, как разделить объявление и определение оператора << () в этом конкретном случае. </p>
Каждый раз, когда я пытаюсь разделить определение, у друга возникают проблемы, и gcc жалуется, что определение оператора << () должно принимать ровно один аргумент. </p>
#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 :: cout, std :: wcout или boost :: asio :: ip :: tcp :: iostream). Второй параметр должен быть привязан к специализированной версии окружающего класса. </p>
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
Кроме того, использование функции, не являющейся членом, не эквивалентно разделению определения и объявления, поскольку функции, не являющиеся членами, не могут получить доступ к закрытым атрибутам класса.