【问题标题】:Cannot understand friend functions in a template class无法理解模板类中的友元函数
【发布时间】:2012-11-19 10:25:37
【问题描述】:

这是我为理解这个概念而编写的代码。代码很好,可以运行。

我不明白为什么需要标记线?

template <class T>
class D
{
    public :
    template <class P>  //<------------------Why is this needed ? --------------
    friend void print(D <P> obj);
};

template <class T>
void print(D<T> obj)
{std::cout<<sizeof(T);};


int main()
{
    D <char>obj3;
    print(obj3);
    return 0;
}

或者换句话说为什么以下不运行?

template <class T>
class D
{
    public :
    friend void print(D <T> obj);
};

【问题讨论】:

  • 该行表明print() 本身就是一个template 函数。
  • 为什么在课堂上需要这个?模板函数在类外有一个完整的定义,加上实例化是在知道数据类型的情况下完成的..
  • 按照模板函数的语法,在声明模板函数之前必须这样写...template &lt;class P&gt; friend void print(D &lt;P&gt; obj);我想这一定是一个原因。

标签: c++ templates friend


【解决方案1】:

根据 [temp.friend],您必须提供显式模板参数才能使模板函数的特化成为朋友:

template <class T>
class D
{
    public :
    friend void print<T>(D <T> obj);
};

没有它,编译器将寻找函数print(),而不是函数模板print()

【讨论】:

  • 您能解释一下什么是显式模板参数吗?不能从谷歌出现的网站上真正了解它..
  • @AshRj 我将在调用中进行解释,因为它最简单,但它适用于您引用函数模板的所有时间。假设您定义了一个实例D&lt;int&gt; d;。当调用print() 时,您可以显式提供模板参数:print&lt;int&gt;(d);,或者不提供它们并让编译器从上下文(这里,从参数)推导出它们:print(d);。明确提供它们意味着将它们列在尖括号&lt; &gt;
  • 感谢您的解释。我明白你在说什么,但我仍然不明白你的答案是如何解释的。你能指导我到任何我可以阅读模板如何工作的地方吗?我认为这里的主要问题是我不明白编译器如何处理模板,因此很难理解这么简单的东西..
  • @AshRj 在我的回答中,显式参数是print&lt;T&gt;( 中的&lt;T&gt;。我不知道我可以建议的参考资料,但是这里有一个books 的列表,也许你可以从那里开始工作。我的回答中的 [temp.friend] 是对 C++11 ISO 标准的引用。
猜你喜欢
  • 1970-01-01
  • 2010-12-19
  • 2011-07-15
  • 2016-10-19
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
相关资源
最近更新 更多