如何在模板类中匹配模板友元函数

How to match template friend function in a template class

本文关键字:友元 函数      更新时间:2023-10-16

我有一个模板类,它声明了一个本身具有模板参数的友元函数。代码如下所示:

template <class T>
class C;
template <class T, class U>
void func(C<T>& t);
template <class T>
class C
{
    template <class U>
    friend void func<T, U>(C<T>& t);
private:
    template <class U>
    void f()
    {
    }
};
template <class T, class U>
void func(C<T>& t)
{
    t.f<U>();
}

但是当我尝试调用func时,我在friend行出现编译错误:

'

func':未找到匹配的重载函数

我怎样才能和C<T>func<T, U>朋友?

关键问题是你声明的朋友与你之前提供的声明不同。第一个需要两个模板参数,但您定义的第二个(友元(只接受一个。一旦解决了这个问题,一切正常:

template <class T>
class C;
template <class U, class T>
void func(C<T>& t);
template <class T>
class C
{
    template <class U, class TT>
    friend void func(C<TT>& t);
private:
    template <class U>
    void f()
    {
    }
};
template <class U, class T>
void func(C<T>& t)
{
    t.template f<U>();
}
int main() {
    C<int> c;
    func<bool>(c);
}

观看直播。

注意 我切换了UT,因为我假设您可能希望推断T并明确指定U