对函数模板朋友进行某些特化

时间:2013-08-08 15:06:12

标签: c++ templates c++11 friend

假设我有

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);
};

请注意,我知道如何将整个模板声明为朋友。

2 个答案:

答案 0 :(得分:0)

显然,目前的C ++中没有办法做我以后的事情。

答案 1 :(得分:-2)

[编辑] 我从website中提出了这个想法,并指出这是可能的, 但没有经过适当的测试。事实证明,这不起作用, 所以请忽略这个建议。

据我所知,OP想要做的事情在c ++中是不可能的...... [/编辑]

您发布的代码会部分专门化函数f,但这是不允许的。

要解决此问题,请从朋友声明中删除空的尖括号:

template<class T>
class X
{
    template <class U>  
    friend void f(T t, U, u);
};