为什么模板函数不能是模板 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);
// ^^
你需要在友元声明中添加<>
来指定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;
}
我正在观看视频教程,我想将模板函数声明为模板的友元 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);
// ^^
你需要在友元声明中添加<>
来指定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;
}