Почему функция члена-друга не распознается как шаблон функции автоматически?

c ++ faq 35.16

http://www.parashift.com/c++-faq-lite/template-friends.html

#include <iostream>

template<typename T>
class Foo {
public:
  Foo(T const& value = T());
  friend Foo<T> operator+ (const Foo<T>& lhs, const Foo<T>& rhs);
  friend std::ostream& operator<< (std::ostream& o, const Foo<T>& x);
private:
  T value_;
};

Автор утверждает:

& apos: Замедление происходит, когда компилятор видит строки друзей в самом определении класса. В тот момент он еще не знал, что функции друзей сами являются шаблонами(why is it? aren't class template member functions be function template by default?); предполагается, что они не являются шаблонами, как это: & apos;

Foo<int> operator+ (const Foo<int>& lhs, const Foo<int>& rhs)
{ ... }  

std::ostream& operator<< (std::ostream& o, const Foo<int>& x)
{ ... }

Why are the above non-templates? aren't these templates that are instantiated via int?

"Когда вы звоните оператору + или оператору & lt; & lt; функции, это предположение заставляет компилятор генерировать вызов не шаблонных функций, но компоновщик даст вам "неопределенный внешний" ошибка, потому что вы никогда не определяли эти не шаблонные функции. & APOS;

Фактически, чтобы компилятор распознал вышеуказанное как шаблон функции, программист должен сделать это явно, как показано ниже:

template<typename T> class Foo;  // pre-declare the template class itself
template<typename T> Foo<T> operator+ (const Foo<T>& lhs, const Foo<T>& rhs);
template<typename T> std::ostream& operator<< (std::ostream& o, const Foo<T>& x);

Кто-нибудь может объяснить? Я нахожу это довольно неприятным и не знаю, почему компилятор не просто создает экземпляр экземпляра класса Foo, заменяя T на «int», и называет его днем.

Благодарю.

Ответы на вопрос(1)

Ваш ответ на вопрос