为什么模板函数不能成为模板类的好友模板函数?

时间:2019-04-09 07:53:39

标签: 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){
    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;            ^

2 个答案:

答案 0 :(得分:4)

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

您需要指定doSomething2是功能模板,例如

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

或者利用模板参数推导来编写

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

LIVE

答案 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;
}