假设我有
template<class T>
void f(T t);
和
template<class T>
class X
{
};
如果我只想f<T>
成为X<T>
的朋友,我声明:
template<class T>
class X
{
friend void f<>(T t);
};
现在假设f声明如下:
template<class T, class U>
void f(T t, U u);
我想声明以下内容:对于任何类型U
f<T, U>
都是X<T>
的朋友。所以我希望f<int, char>
成为X<int>
的朋友,但我不希望f<char, int>
更加忠于X<int>
。这可能吗?以下似乎没有编译
template<class T>
class X
{
template <class U>
friend void f<>(T t, U, u);
};
请注意,我知道如何将整个模板声明为朋友。
答案 0 :(得分:0)
显然,目前的C ++中没有办法做我以后的事情。
答案 1 :(得分:-2)
[编辑] 我从website中提出了这个想法,并指出这是可能的, 但没有经过适当的测试。事实证明,这不起作用, 所以请忽略这个建议。
据我所知,OP想要做的事情在c ++中是不可能的...... [/编辑]
您发布的代码会部分专门化函数f,但这是不允许的。
要解决此问题,请从朋友声明中删除空的尖括号:
template<class T>
class X
{
template <class U>
friend void f(T t, U, u);
};