【发布时间】:2019-04-09 07:53:38
【问题描述】:
我正在关注一个视频教程,我想将一个模板函数声明为模板类的朋友。我不知道为什么代码会抛出错误。
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:注意:此处声明为私有 诠释 b; ^
【问题讨论】:
-
您希望所有
doSomething2<U>都成为friend吗?或任何doSomething2<C<U>>?还是只有doSomething2<C<T>>或doSomething2<T>? -
@Jarod42 我希望第一个成为朋友。你说的其他功能是什么意思?
-
您有
template <class T> class C;和template<class U>void doSomething2(U)(其中T和U可能相等或不相等或有其他关系)。例如,doSomething2<int>可能想要使用C<float>。因为这些不同的变体之间的语法会有些不同。 -
不,我以为它们是一样的。