gpt4 book ai didi

c++ - 如何为模板 'using' 类型别名的流输出运算符 << 提供重载?

转载 作者:行者123 更新时间:2023-12-01 14:49:04 27 4
gpt4 key购买 nike

有谁知道为什么这不能编译以及如何修复它?不知何故,编译器找不到流运算符的正确模板实例化,但我不明白为什么。

#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;
}

最佳答案

Does anybody know why this does not compile and how to fix it?



是的:问题是你声明 Row收到 int
template <int N>
using Row = std::array<int, N>;

并尝试在操作符中截取它的大小作为 intstd::array接收(用于第二个参数) std::size_t .

所以你的 Row<4> (即 std::array<int, 4u> 其中 4ustd::size_t )与您的运营商不匹配,因为运营商寻找 std::array<int, N>哪里 Nint .

修复:定义 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com