假设我有两个模板类。
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
、多对多的关系成为朋友。我有两个问题,
允许 baseclass1 仅与函数为友的语法是什么
baseclass2<class D>::foo<class T>( D& x, T& y).
而且,允许baseclass1
只与函数为友的语法是什么
baseclass2<class D>::foo<class T>( D& x, T& y)
where T
frombaseclass1
匹配T
from Function 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
}
甚至注意到 muffin 朋友在哪里错误的 foo,仍然会导致编译错误。这适用于函数和类。我完全愿意接受在我的具体情况下这是不可能的(实际上看起来越来越多)我只是想了解原因。