Почему функция члена-друга не распознается как шаблон функции автоматически?
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», и называет его днем.
Благодарю.