为什么模板函数不能是模板 class 的友元模板函数?

Why template function cannot be a friend template function of a template class?

我正在观看视频教程,我想将模板函数声明为模板的友元 class。我不知道为什么代码会抛出错误。

template<class T>class C;
template<class T>void doSomething2(T);
template<class T>class C{
    int b;
    friend void doSomething2(T);

};
template<class U>void doSomething2(U u){
    C<U> obj;
    obj.b=100;
}
int main()
{
    C<int> obj;
    int a=44;
    doSomething2(a);
    return 0;
}

编译器抛出错误。

错误:

templates_friends_38.cpp: In instantiation of ‘void doSomething2(T) [with T = int]’: templates_friends_38.cpp:40:19: required from here templates_friends_38.cpp:32:9: error: ‘int C::b’ is private within this context obj.b=100; ~~~~^ templates_friends_38.cpp:25:9: note: declared private here int b; ^

friend void doSomething2(T);,您将一个名为 doSomething2 的新非模板函数声明为 friend,这不是您所期望的。

需要指定doSomething2为函数模板,例如

friend void doSomething2<T>(T);
//                      ^^^

或者利用模板参数推导,只写

friend void doSomething2<>(T);
//                      ^^

LIVE

你需要在友元声明中添加<>来指定doSomething2是一个模板函数:

template<class T>class C;
template<class T>void doSomething2(T);
template<class T>class C{
    int b;
    friend void doSomething2<>(T);

};
template<class U>void doSomething2(U u){
    C<U> obj;
    obj.b=100;
}
int main()
{
    C<int> obj;
    int a=44;
    doSomething2(a);
    return 0;
}