如何为流输出运算符提供重载<<模板'using'类型别名?
How to provide an overload for the stream output operator << for a template 'using' type alias?
>有人知道为什么这不能编译以及如何修复它吗?不知何故,编译器找不到流运算符的正确模板实例化,但我不明白为什么。
#include <array>
#include <iostream>
template <int N>
using Row = std::array<int, N>;
template <int N>
std::ostream& operator <<(std::ostream& o, const Row<N>& mc) {
for (auto i : mc)
o << i << " ";
return o;
}
int main(int argc, char *argv[]) {
Row<4> row {};
std::cout << row << std::endl;
}
有谁知道为什么这不编译以及如何修复它?
是的:问题是您声明Row
正在接收int
template <int N>
using Row = std::array<int, N>;
并尝试在运算符中拦截它的大小作为int
,当std::array
收到(对于第二个参数(一个std::size_t
。
因此,您的Row<4>
(即std::array<int, 4u>
4u
是std::size_t
(与您的运算符不匹配,因为运算符会查找N
是int
的std::array<int, N>
。
修复:将Row
定义为接收std::size_t
(可选,只是为了清楚起见(,并在运算符中推断出std::size_t
(强制(。
template <std::size_t N> // <--- you have to intercept a std::size_t
std::ostream& operator <<(std::ostream& o, const Row<N>& mc) {
for (auto i : mc)
o << i << " ";
return o;
}
替代 C++17 修复:截获运算符大小作为auto
template <auto N> // <--- auto can intercept a std::size_t
std::ostream& operator <<(std::ostream& o, const Row<N>& mc) {
for (auto i : mc)
o << i << " ";
return o;
}
相关文章:
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- '&lt;'''&lt;'''&quot的模板类错误''令牌”
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- 关于使用运算符<<为新手提供C++中的模板
- 运算符<<(ostream&os,..)用于模板类
- & lt; & lt;使用继承和模板定义
- operator< & lt;重载、名称空间和模板