C++ 为什么模板函数不能是模板类的友元模板函数?

C++ 为什么模板函数不能是模板类的友元模板函数?,c++,templates,friend,C++,Templates,Friend,我正在学习一个视频教程,我想声明一个模板函数作为模板类的朋友。我不知道为什么代码会抛出错误 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){

我正在学习一个视频教程,我想声明一个模板函数作为模板类的朋友。我不知道为什么代码会抛出错误

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;
}
templateclass C;
模板无效剂量物质2(T);
模板C类{
int b;
friend void doSomething2(T);
};
模板无效doSomething2(U){
C obj;
对象b=100;
}
int main()
{
C obj;
INTA=44;
doSomething2(a);
返回0;
}
编译器抛出错误

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;
}
错误:

模板\u friends\u 38.cpp:在“void doSomething2(T)[with T=int]的实例化中: 模板\u朋友\u 38.cpp:40:19:此处为必填项 templates_friends_38.cpp:32:9:错误:“int C::b”在此上下文中是私有的 对象b=100; ~~~~^ 模板\u friends\u 38.cpp:25:9:注意:此处声明为私有 int b; ^


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

您需要指定
doSomething2
是一个函数模板,例如

friend void doSomething2<T>(T);
//                      ^^^
doSomething2(T);
//                      ^^^
或者利用模板参数推断,只需编写

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

您需要在好友声明中添加
,以指定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;
}
templateclass C;
模板无效剂量物质2(T);
模板C类{
int b;
friend void doSomething2(T);
};
模板无效doSomething2(U){
C obj;
对象b=100;
}
int main()
{
C obj;
INTA=44;
doSomething2(a);
返回0;
}

是否希望所有
doSomething2
都成为
朋友
?或任何
doSomething2
?或者只有
doSomething2
或者
doSomething2
?@Jarod42我想要第一个成为朋友。你所说的其他函数是什么意思?你有
模板C类
模板无效doSomething2(U)
(其中
T
U
可能相等或不相等,或者有其他关系)<例如,code>doSomething2可能需要使用
C
。因为不同的变体之间的语法会有点不同。不,我假设它们是相同的。