在模板外部重载模板类的输出流运算符

2023-12-09

我想重载输出流运算符<<在模板类定义之外。

在模板类中实现它就可以了:

template
<typename T,int _MaxSize=10,template <class C> class Policy=NoCheck,typename Container=std::vector<T>>
class MyContainer : public Policy<T>
{
public:
  MyContainer():p(_MaxSize){};
  std::ostream& operator<<(MyContainer<T,_MaxSize,Policy,Container>& obj){ };
private:
  Container p;
};

但是当我尝试在模板类之外执行此操作时:

template
<typename T,int _MaxSize=10,template <class C> class Policy=NoCheck,typename Container=std::vector<T>>
class MyContainer : public Policy<T>
{
public:
  MyContainer():p(_MaxSize){};
  friend std::ostream& operator<<(std::ostream& out,MyContainer<T,_MaxSize,Policy,Container> obj);
private:
  Container p;
};

template
<typename T,int _MaxSize,template <class C> class Policy,typename Container>
std::ostream& operator<<(std::ostream& out,MyContainer<T,_MaxSize,Policy,Container> obj)
{
};

编译器抱怨:

warning: friend declaration ‘std::ostream& operator<<(std::ostream&, MyContainer<T, _MaxSize, Policy, Container>)’ declares a non-template function [-Wnon-template-friend]
tempstruct.cc:39:97: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)

任何人都可以举一个简单的例子来说明输出流运算符如何<<在模板类之外定义?

在我在这里找到的相关帖子中,每个人都在模板类中执行此操作。


任何人都可以举一个简单的例子来说明如何在模板类之外定义输出流运算符

不,因为这并不简单。我可以举一个复杂的例子:

// Declare the class template, because we need it to declare the operator
template <typename,int,template <class C> class,typename> class MyContainer;

// Declare the operator, because (as the error says) templates must be declared
// in the namespace before you can declare them friends. At this point, we can't
// define the operator, since the class template is incomplete.
template 
<typename T,int _MaxSize,template <class C> class Policy,typename Container>
std::ostream& operator<<(std::ostream&,MyContainer<T,_MaxSize,Policy,Container>);

// Define the class template
template
<typename T,int _MaxSize=10,template <class C> class Policy=NoCheck,typename Container=std::vector<T>>
class MyContainer : public Policy<T>
{
public:
  MyContainer():p(_MaxSize){};

  // Include <> to indicate that this is the template
  friend std::ostream& operator<< <>(std::ostream& out,MyContainer<T,_MaxSize,Policy,Container> obj);
private:
  Container p;
};

// Finally define the operator
template
<typename T,int _MaxSize,template <class C> class Policy,typename Container>
std::ostream& operator<<(std::ostream& out,MyContainer<T,_MaxSize,Policy,Container> obj)
{
  // print some stuff
};

在我在这里找到的相关帖子中,每个人都在模板类中执行此操作。

我会那么做;这会简单得多。或者,更好的是,我会根据公共接口实现输出,假设它提供了对容器内容的足够访问权限。那么您就不需要朋友声明,因此也不需要前向声明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在模板外部重载模板类的输出流运算符 的相关文章

随机推荐

  • 尝试抓住展开的线吗?斯威夫特 2.0、XCode 7

    我的代码中有以下展开行 UIApplication sharedApplication openURL NSURL string url 有时会出现这样的致命错误 致命错误 在解包可选值时意外发现 nil 我知道为什么有时会出现此错误 但是
  • 将解析结果自动串联成向量

    我编写了一些规则来将浮点数解析为两个 std vector 的浮点数 它们又存储在一个结构中 数据输入 object name01 v 1 5701 33 8087 0 3592 v 24 0119 0 0050 21 7439 a com
  • 在 WHERE 子句中应用条件过滤

    我在 SELECT 语句中加入几个表 如下所示 它具有三个参数 DECLARE Jobid INT 0 leadid INT 0 employeeid INT 0 SELECT e id l id j id e NAME l NAME j
  • 如何在 jsp 页面和 servlet 之间共享数据

    我有几个 jsp 页面和几个 servlet 我需要将一些信息保存到会话变量中 在jsp页面中我简单的引用 session get or session set 无需显式声明 HttpSession 对象 但在 servlet 中 适用正确
  • 如何防御性地编写代码以防止随机引用“表 0”和空值?

    我正在检索适量的数据并对其进行处理 没有什么独特的 起初奇怪的是 对于某些数据集 它工作得很好 而对于其他数据集 我收到以下错误消息 不过 这个错误消息似乎完全是胡言乱语 无论如何都是误导性的 因为失败集的数据并不比成功集的数据多 所以运行
  • 排序命令在 unix 中无法正常工作以对 csv 文件进行排序

    我有一个 csv 文件 需要根据时间戳进行排序 它是 csv 中的第三列 我使用以下命令进行排序 awk NR lt 2 print next print sort t k3 8 3 11nr k3 1 3 3rM k3 4rd 当年份为单
  • Session 变量在 ASP.Net 页面的 Parallel.For 循环中是线程安全的吗

    在下面的代码中更改会话变量 即 Session Progress 是否安全 此代码是 ASP Net 页面隐藏代码的一部分 并行运行循环时 两个迭代可能会同时运行 如果两个迭代都更改了同一会话变量 则会导致问题 public void Lo
  • 如何为我的 AWS-EB 实例启用 SSH?

    我有一个正在运行的 AWS Elastic Beanstalk 实例 并附加了 RDS 数据库 并且希望从我的开发计算机启用 SSH 最好的方法是什么 具体来说 我可以从 AWS 控制台执行此操作吗 我能够保留当前的所有 EB 设置和结构吗
  • Cassandra 更改列类型:哪些类型兼容?

    互联网上有一些关于无法更改列类型的示例的一些零碎信息 例如 在数据斯塔克斯网站有一个提到 更改聚类列的类型 更改其上的列 定义了一个索引 或者 例如 here提到你无法转换uuid to timeuuid 从我个人的经历来看 我无法改变te
  • 使用 MinGW 编译为带有一些未定义引用的 .dll

    我听说所有 Windows DLLmust包含它引用的每个符号的定义 因此像这样的 DLL 文件永远不会编译 因为它没有实现bar void bar declspec dllexport void foo bar 我认为类比是 DLL 本质
  • 更改字符向量的选定元素

    以下原则是否有更短的版本来重命名数据框的某些列 data1 lt data frame a 1 3 b 1 3 c 1 3 data1Names lt names data1 data1Names data1Names a lt hello
  • 关于 torch.nn.DataParallel 的问题

    我是深度学习领域的新手 现在我正在复制一篇论文的代码 因为他们使用多个 GPU 所以有一个命令torch nn DataParallel model device ids args gpus cuda 在代码中 但我只有一个GPU 什么 我
  • 解决 IE7 bug“input type=file”onchange 触发两次?

    你有没有遇到过这个IE7的bug
  • 将 Silverlight 连接到本地计算机的 COM 端口

    我一直在寻找一种方法让我的 silverlight 应用程序与本地计算机上的 COM 端口进行通信 有没有人能够让 Silverlight 成功连接到本地计算机的 COM 端口 如果是这样 你能指出我的文档吗 Silverlight 无法做
  • java中12小时制到24小时制的转换

    在我的应用程序中 我需要格式化12 hours时间到24 hours时间 我必须使用什么方法 例如 像这样的时间10 30 AM java中如何转换为24小时时间 尝试这个 import java text SimpleDateFormat
  • 导入 RealmSwift 不再使用 CocoaPods 工作

    RealmSwift 的 CocoaPods 安装克鲁赫森受到推崇的here 或者也可以从realm io页面推荐here 基本上可以工作 但是我使用 Swift 0 92 3 的应用程序中仍然存在一个问题 以下导入不再被识别 import
  • Android 黑屏前的启动画面

    我想在 onCreate 方法中初始化所有内容时显示启动屏幕 但我需要将内容绘制到屏幕上的组件也在初始化 因此当我启动应用程序时和 onCreate 之后会出现黑屏方法已完成 然后仅绘制第一个屏幕 我想要一个闪屏 而不是黑屏 这是我在 on
  • 线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/http/ConnectionReuseStrategy:

    我正在尝试使用 Eclipse 在 Maven 项目中作为 Java 应用程序运行 但出现以下运行时错误 错误如下所示 线程 main java lang NoClassDefFoundError 中出现异常 org apache http
  • 使用PHP邮件通过smtp发送

    有谁知道是否可以配置 php 的 mail 命令 使其仅使用 SMTP 服务器而不是本地 sendmail 我们在电子邮件被标记为垃圾邮件时遇到了麻烦 我们的服务器运行的是 RedHat 5 Enterprise 我知道有多种 PHP 库充
  • 在模板外部重载模板类的输出流运算符

    我想重载输出流运算符 lt lt 在模板类定义之外 在模板类中实现它就可以了 template