为什么模板函数不能成为模板类的友元模板函数?

3
我正在跟随一个视频教程,想将模板函数声明为模板类的友元。我不知道为什么代码会抛出错误。
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: 在实例化 'void doSomething2(T) [with T = int]' 时: templates_friends_38.cpp:40:19: 需要在此处进行 templates_friends_38.cpp:32:9: 错误:'int C::b' 在此上下文中是私有的 obj.b=100; ~~~~^ templates_friends_38.cpp:25:9: 注意:此前声明为私有 int b; ^

注:该段内容涉及代码,如有疑问,请咨询相关技术人员。


你想让所有的 doSomething2<U> 都是 friend 吗?还是任何 doSomething2<C<U>>?或者只有 doSomething2<C<T>>doSomething2<T> - Jarod42
@Jarod42 我想第一个是朋友。你所说的其他功能是什么意思? - user5826166
你有template <class T> class C;template<class U>void doSomething2(U)(其中TU可能相等或不相等,或者具有其他关系)。例如,doSomething2<int>可能想要使用C<float>。因为这些不同变体之间的语法略有不同。 - Jarod42
不,我以为它们是一样的。 - user5826166
2个回答

4
当声明一个名为doSomething2的非模板函数时,你需要使用friend关键字。这不是你期望的那个函数。
你需要指定doSomething2是一个函数模板,例如:
friend void doSomething2<T>(T);
//                      ^^^

或者利用模板参数推导,只需编写以下代码:
friend void doSomething2<>(T);
//                      ^^

LIVE


4

您需要在友元声明中添加<>,以指定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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接