有人知道为什么它不能编译以及如何解决吗?编译器以某种方式无法为流运算符找到正确的模板实例,但是我不明白为什么。
#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
)与您的运算符不匹配,因为该运算符正在查找std::array<int, N>
,而N
是int
。修复:将
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;
}
关于c++ - 如何为模板 'using'类型别名的流输出运算符<<提供重载?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59542320/