我正在观看视频教程,我想将模板函数声明为模板类的朋友。我不知道为什么代码会引发错误。
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; ^
答案 0 :(得分:4)
friend void doSomething2(T);
,您将一个名为doSomething2
的新非模板函数声明为friend
,这不是您所期望的。
您需要指定doSomething2
是功能模板,例如
friend void doSomething2<T>(T);
// ^^^
或者利用模板参数推导来编写
friend void doSomething2<>(T);
// ^^
答案 1 :(得分: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;
}