下記コードを参考に出力イテレーターを書いてみたのですがエラーが出てうまくコンパイルが通りません。
output_iteratorはclassではないというような意味のエラーが出るのですが、なぜでしょうか?

参考にしたサイト:江添亮のC++入門

エラーメッセージ:

output_iterator.cpp:17:18: error: 'output_iterator' is not a class, namespace, or enumeration
output_iterator& output_iterator::operator*() {
                 ^
output_iterator.cpp:4:8: note: 'output_iterator' declared here
struct output_iterator {
       ^
output_iterator.cpp:20:18: error: 'output_iterator' is not a class, namespace, or enumeration
output_iterator& output_iterator::operator++(int) {
                 ^
output_iterator.cpp:4:8: note: 'output_iterator' declared here
struct output_iterator {
       ^
output_iterator.cpp:23:18: error: 'output_iterator' is not a class, namespace, or enumeration
output_iterator& output_iterator::operator++() {
                 ^
output_iterator.cpp:4:8: note: 'output_iterator' declared here
struct output_iterator {
       ^
output_iterator.cpp:29:18: error: 'output_iterator' is not a class, namespace, or enumeration
output_iterator& output_iterator::operator=(const T& x) {
                 ^
output_iterator.cpp:4:8: note: 'output_iterator' declared here
struct output_iterator {
       ^
4 errors generated.

参考にしたコード:

struct cout_iterator
{
// --- ボイラープレートコード
    // 出力イテレーターでは使わないのでvoidでいい
    using difference_type = void ;
    using value_type = void ;
    using reference = void ;
    using pointer = void ;
    // イテレーターカテゴリーは出力イテレーター
    using iterator_category = std::output_iterator_tag ;
    // 何もしない
    // 自分自身を返すだけ
    cout_iterator & operator *() { return *this ; }
    cout_iterator & operator ++() { return *this ; }
    cout_iterator & operator ++(int) { return *this ; }
// --- ボイラープレートコード

    // ここが肝心
    template < typename T >
    cout_iterator & operator =( T const & x )
    {
        std::cout << x ;
        return *this ;
    }
} ;


int main()
{
    std::vector<int> v = {1,2,3,4,5} ;
    cout_iterator out ;

    std::copy( std::begin(v), std::end(v), out ) ;
}

自分で書いてみたコード:

#include <iostream>
#include <vector>
template < typename T >
struct output_iterator {
    using difference_type = void;
    using value_type = void;
    using reference = void;
    using pointer = void;
    using iterator_category = std::output_iterator_tag;
    public:
        output_iterator& operator*();
        output_iterator& operator++();
        output_iterator& operator++(int);
        output_iterator& operator=(const T& x);
};

output_iterator& output_iterator::operator*() {
    return *this;
}
output_iterator& output_iterator::operator++(int) {
    return *this;
}
output_iterator& output_iterator::operator++() {
    return *this;
}

// assignment implementation
template < typename T >
output_iterator& output_iterator::operator=(const T& x) {
    std::cout << x;
    return *this;
}

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    output_iterator out;
    std::copy(vec.begin(), vec.end(), out);
}