【问题标题】:Why template function cannot be a friend template function of a template class?为什么模板函数不能是模板类的友元模板函数?
【发布时间】: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&lt;U&gt; 都成为friend 吗?或任何doSomething2&lt;C&lt;U&gt;&gt;?还是只有doSomething2&lt;C&lt;T&gt;&gt;doSomething2&lt;T&gt;
  • @Jarod42 我希望第一个成为朋友。你说的其他功能是什么意思?
  • 您有template &lt;class T&gt; class C;template&lt;class U&gt;void doSomething2(U)(其中TU 可能相等或不相等或有其他关系)。例如,doSomething2&lt;int&gt; 可能想要使用 C&lt;float&gt;。因为这些不同的变体之间的语法会有些不同。
  • 不,我以为它们是一样的。

标签: c++ templates friend


【解决方案1】:

您需要在朋友声明中添加&lt;&gt; 以指定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;
}

【讨论】:

    【解决方案2】:

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

    你需要指定doSomething2是一个函数模板,例如

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

    或者利用模板参数推导,直接写

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

    LIVE

    【讨论】:

      猜你喜欢
      • 2010-12-19
      • 1970-01-01
      • 2016-10-19
      • 2013-09-18
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多