Dlaczego funkcja członka znajomego nie jest automatycznie rozpoznawana jako szablon funkcji?

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

Autor twierdzi:

„Szarpnięcie zdarza się, gdy kompilator widzi linię znajomego w odpowiedniej definicji klasy. W tym momencie nie zna jeszcze funkcji znajomych jako szablonów(dlaczego to jest? nie są szablonami funkcji szablonów klas, domyślnie szablonem funkcji?); zakłada, że ​​nie są to takie szablony: '

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

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

Dlaczego powyższe nie-szablony? czy te szablony nie są tworzone przez int?

„Gdy wywołujesz funkcje operator + lub operator <<, założenie to powoduje, że kompilator generuje wywołanie funkcji innych niż szablon, ale linker daje błąd„ niezdefiniowany zewnętrzny ”, ponieważ nigdy nie zdefiniowałeś tych funkcji innych niż szablonowe . '

W rzeczywistości, aby kompilator rozpoznał powyższe jako szablon funkcji, programista musi to zrobić jawnie, jak poniżej:

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

Czy ktoś mógłby to wyjaśnić? Uważam to za dość irytujące i nie wiem, dlaczego kompilator nie tworzy instancji instancji klasy Foo, zastępując T przez „int”, i nazywam to dniem.

Dzięki.

questionAnswers(1)

yourAnswerToTheQuestion