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.