类模板友元函数的声明(友元函数可以在类内定义吗)

2009-08-09摘自《SunStudio12:C++用户指南》第6.7.3节 模板在使用前必须先声明。一个友元声明构成了模板的使用,而非模板的声明。(Afrienddeclarationconstitutesauseofthetemplate,notadeclarationofthetemplate.)所以实际的模板声明必须在友元声明之前

大家好,又见面了,我是你们的朋友全栈君。

2009-08-09

摘自《Sun Studio 12: C++ 用户指南》 第 6.7.3 节

 

模板在使用前必须先声明。一个友元声明构成了模板的使用,而非模板的声明。(A friend declaration constitutes a use of the template, not a declaration of the template. )所以实际的模板声明必须在友元声明之前。例如,编译系统尝试链接以下示例中生成的目标文件时,对未实例化的operator<<函数,会生成一个未定义的错误

 

示例6–2 友元声明问题的示例

 

请注意,因为编译器将以下代码作为普通函数(array类的friend)的声明进行读取(because the compiler reads the following as the declaration of a normal function that is a friend of the array class),所以编译期间不会出现错误消息

因为operator<<实际上是模板函数,所以需要在声明template class array之前提供此“模板函数”(operator<<?)的声明。但是,由于operator<<有一个type为array<T>的形参(模板类型形参?),因此在声明函数之前,必须声明array<T>。文件array.h必须如下所示:

Because operator<< is really a template function, you need to supply a template declaration for prior to the declaration of template class array. However, because operator<< has a parameter of type array<T>, you must precede the function declaration with a declaration of array<T>. The file array.h must look like this:

 

 //———————————————————————————–

换一个能通过的版本,所有代码都放到同一个文件中。前面那个未通过乃是因为文件之间include有问题,在array.cc中#include “array.h”,然后在main.cc中#include “array.cc”即可。

//———————————————————————————— 

再换一个所有代码合在一起的版本,使用了using namespace std;

主要是验证下面这段代码的第七行

“template<class T> ostream& operator<<(ostream&, const array<T>&);”

可以被删掉!

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127793.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HashMap工作原理和扩容机制

    HashMap工作原理和扩容机制HashMap工作原理HashMap扩容1HashMap的扩容时机2HashMap的扩容过程补充1容量必须是2的幂2rehashReferences1.HashMap工作原理HashMap作为优秀的Java集合框架中的一个重要的成员,在很多编程场景下为我们所用。HashMap作为数据结构散列表的一种实现,就其工作原理来讲单独列出一篇博客来讲都是不过分的。由于本文主要是简单总

    2022年6月18日
    30
  • 求逆矩阵 —— LU分解法「建议收藏」

    求逆矩阵 —— LU分解法「建议收藏」LU分解:算法步骤:1.将A矩阵分解为L下三角矩阵和U上三角矩阵。step1.L对角线填充为1step2.step3.step4.U是按行迭代计算,L是按列迭代计算,UL交错计算,且U先L一步fork=1tom-1:{}2.分别对L和U求逆,得到Linv和Uinv.step1….

    2022年8月21日
    12
  • JsonArray用法(二)

    JsonArray用法(二)一 json 格式字符串在 java 中转成 JSONArray 或者 JSONObject 一 java 处理 json 格式字符串首先转成 JSONArray 或 JSONObject 类型 1 如果是 JSONArray 格式 最外层是中括号 表示数组 JSONArrayarr JSONArray parseArray text 注 text 必须是 json 格式的

    2025年7月21日
    2
  • golang 进制转换_java string转integer

    golang 进制转换_java string转integer1-Youmaywriteyourconversionfunction(Fastest):funcString(nint32)string{buf:=[11]byte{}pos:=len(buf)i:=int64(n)signed:=i<0ifsigned{i=-i}for{pos–buf[pos],i=’0’+byt

    2025年11月30日
    4
  • 如何用import导入一个包_import怎么导入

    如何用import导入一个包_import怎么导入前言我们在开发项目时经常会进行导包有import*格式的,还有from*import*格式的,最后就会显示的很乱,那么有没有什么工具能对导包进行一键排序呢?答案是有的,使用isort工具i

    2022年8月7日
    5
  • 激光测距项目整体框图及原理

    激光测距项目整体框图及原理**前言:**因为前面几个星期在忙着准备一个面试,这个星期开始持续更新。。。今天的内容是相位式激光测距项目的一个整体框图及原理介绍,这部分文章链接将会加到之前的大纲中!大纲链接:目录大纲目录:1相位式激光测距原理2FFT与APFFT鉴相法1相位式激光测距原理激光测距相位法的原理这里就简单介绍一下,下面几张图片均来源于网络。这个项目主要是对激光强度进行调制的相位式激光测距(…

    2022年6月2日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号