For code like the following:

template <typename T>
class Wrapper {
public:
    Wrapper(T value) : value_(value) {}

    template <typename CharT, typename Traits>
    friend std::basic_ostream<CharT, Traits>&
    operator<<(std::basic_ostream<CharT, Traits>& os,
               const Wrapper& obj)
    {
        os << obj.value_;
        return os;
    }

private:
    T value_;
};

Is there a way to move the operator<< definition outside the class template?

I have not found a direction solution, though some workarounds are possible: say, proxying through a member function template; or make the operator<< template have three template parameters:

    template <typename CharT, typename Traits, typename U>
    friend std::basic_ostream<CharT, Traits>&
    operator<<(std::basic_ostream<CharT, Traits>& os,
               const Wrapper<U>& obj);


However, I am puzzled by the asymmetry: Is my original code a case where only the inline definition is possible?