Следующий пример компилируется отлично, но я не могу понять, как отделить объявление и определение оператора < <() - это конкретный случай.Как разбить определение функции имени шаблона в классе шаблона?
Каждый раз, когда я пытаюсь разделить определение, вызывающий проблему, проблема и 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;
}
< < Оператор() должен иметь свободный первый параметр для работы с различными видами выходных потоков (станд :: COUT, станд :: wcout или повышение :: ASIO :: IP :: ТСР: : 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
Почему вы хотите параметризовать тип OSTREAM? Общая идиома будет определять оператор << как: 'friend std :: ostream & operator << (std :: ostream & os, Test & rhs) {...}' –
@dribeas: потому что я хочу иметь возможность использовать другие выходных потоков. Как boost :: asio :: ip :: tcp :: iostream и boost :: asio :: local :: stream_protocol :: iostream. – joke