Не могу вынести определение friend-оператора из тела шаблонного класса

Код снизу выдаёт ошибку неразрешенных внешних элементов. Проблема связана с определением оператора вывода. Если я вношу его определение в класс Number, то ошибки нет.

#include <iostream>

template <typename T>
class Number
{
    T val;

    friend std::ostream& operator<< (std::ostream& os, const Number<T>& num);
public:
    Number() : val(T{}) { }
    Number(T value) : val{ value } { }
};

template <typename T>
std::ostream& operator<< (std::ostream& os, const Number<T>& num)
{
    os << num.val;
    return os;
}

int main()
try
{
    Number<int> a;
    a = 10;
    std::cout << a;
    return 0;
}
catch (std::exception& e)
{
    std::cout << e.what();
    return 1;
}
catch (...)
{
    std::cout << "Unknown error";
    return 2;
}

Ответы (1 шт):

Автор решения: Harry

Запишите его так, поясняя, что это все же шаблонный оператор...:

template<typename U>
friend std::ostream& operator<< (std::ostream& os, const Number<U>& num);

Больше ничего менять не надо.

См. https://ideone.com/0Mq5Cf

→ Ссылка