テンプレートクラス宣言内でフレンドテンプレート関数を次のように定義すると、コンパイルできます。
#include <iostream>
template <typename T>
class X {
public:
X(int i) : n(i) {}
private:
T n;
template <typename U>
friend void doStuff(const X<T>& x, const U& u)
{
std::cout << (x.n + u) << std::endl;
}
};
int main()
{
X<int> x(1);
doStuff(x, 3);
return 0;
}
しかし、次のように、doStuff()
クラスの宣言の直後に、クラスのデカラレーションの定義を移動するとX<>
、コンパイルできません。
template <typename U>
template <typename T>
void doStuff(const X<T>& x, const U& u)
{
std::cout << (x.n + u) << std::endl;
}
次のコードも同様です。
template <typename U, typename T>
void doStuff(const X<T>& x, const U& u)
{
std::cout << (x.n + u) << std::endl;
}
doStuff()
では、クラス宣言の外部でテンプレート関数をどのように定義する必要がありますか?
前もって感謝します。