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
。因为不同的变体之间的语法会有点不同。不,我假设它们是相同的。