如何在模板类中匹配模板好友功能

Ill*_*ack 5 c++ templates friend

我有一个模板类,它声明一个具有模板参数的友函数。代码如下:

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>();
}
Run Code Online (Sandbox Code Playgroud)

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

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

我该如何交func<T, U>朋友C<T>

Sto*_*ica 4

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

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);
}
Run Code Online (Sandbox Code Playgroud)

观看直播

请注意,我切换U并向T上,因为我假设您可能需要T推断并U明确指定。