2つのテンプレートクラスがあるとします。
template<class T>
class baseclass1
{
template<class> friend class baseclass2;
}
template<class D>
class baseclass2
{
template<class T> void foo( D& x, T& y)
{
...
}
}
上記のコードにより、すべてのタイプのbaseclass1が、すべてのタイプのbaseclass2
多対多の関係を友好することができます。2つの質問があります。
baseclass1が関数だけをフレンドできるようにするための構文は何ですか
baseclass2<class D>::foo<class T>( D& x, T& y).
baseclass1
そして、関数だけを友だちにするための構文は何ですか
baseclass2<class D>::foo<class T>( D& x, T& y)
ここで、T
fromはfrom関数とbaseclass1
一致します。T
foo
編集
テンプレートの特殊化を友だちにすることはできないと主張し続ける人たちへ。このコードは機能します
template<class cake>
class foo
{
public:
static void bar(cake x)
{
cout << x.x;
}
};
class pie
{
public:
void set( int y){ x = y; }
private:
int x;
friend void foo<pie>::bar(pie x);
};
class muffin
{
public:
void set( int y){ x = y; }
private:
int x;
friend void foo<pie>::bar(pie x);
};
int main
{
pie x;
x.set(5);
foo<pie>::bar(x);
muffin y;
y.set(5);
//foo<muffin>::foo(y); //Causes a compilation Error because I only friended the pie specialization
}
マフィンが間違ったfooと友達になり、それでもコンパイルエラーが発生する場所に注意してください。これは、関数とクラスの両方で機能します。私の特定の状況ではこれが不可能であることを完全に受け入れたいと思います(実際にはそのように見えています)理由を理解したいと思います。