次のコードが与えられます。
#include <iostream>
template<typename T>
class Foo
{
public:
Foo(const T& 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_;
};
コンパイラは、次の構文を使用せずに、テンプレート パラメーターを持つ両方のフレンド関数を問題なくコンパイルします。
template <typename T>
friend Foo<T> operator+ (const Foo<T>& lhs, const Foo<T>& rhs)
また
friend Foo<T> operator+ <>(const Foo<T>& lhs, const Foo<T>& rhs)
また
friend Foo<T> operator+ <T>(const Foo<T>& lhs, const Foo<T>& rhs)
テンプレートクラス自体の内部で実装によって定義されているためです。
コンパイラは、テンプレート宣言を含めずに、これらのフレンド関数をテンプレート パラメーターでコンパイルするにはどうすればよいでしょうか? クラス内に実装するだけで十分なのはなぜですか?
この概念については、 「テンプレート フレンドを使用するとリンカー エラーが発生するのはなぜですか?」のセクションで学びました。