有人知道为什么它不能编译以及如何解决吗?编译器以某种方式无法为流运算符找到正确的模板实例,但是我不明白为什么。

#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>,其中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/

10-11 23:22
查看更多