Por que a função de membro amigo não é reconhecida como modelo de função automaticamente?

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_;
};

O autor afirma:

“O problema acontece quando o compilador vê as linhas de amigos na definição de classe propriamente dita. Naquele momento, ainda não se sabe que as funções do amigo são elas próprias modelos(por que não são funções de membro de modelo de classe, por padrão, o modelo de função?); ele assume que eles não são modelos como este:

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

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

Por que os não-modelos acima? Esses modelos não são instanciados via int?

'Quando você chama o operador + ou operador << funções, essa suposição faz com que o compilador gere uma chamada para as funções que não são de modelo, mas o vinculador lhe dará um erro "indefinido externo" porque você nunca realmente definiu essas funções . '

De fato, para fazer o compilador reconhecer o acima como modelo de função, o programador tem que fazer isso explicitamente como abaixo:

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);

Alguém poderia explicar? Eu acho isso bastante vexatório e não sei porque o compilador não instancia apenas uma instância da classe Foo, substituindo T por 'int', e chama-a um dia.

Obrigado.

questionAnswers(1)

yourAnswerToTheQuestion