打印用户定义类型的std::vector

Printing std::vector of a user defined type

本文关键字:std vector 类型 用户 定义 打印      更新时间:2023-10-16

请看下面的两个代码块。在第二个例子中,我把类A放到了一个命名空间中。现在我的脑子沸腾了,试图理解为什么第一部分没问题,而第二部分不行。抱歉,对于大多数代码来说。你能给我解释一下吗?我用的是微软的c++ 14编译器。请帮助。

可以:

#include <iostream>
#include <vector>
#include <iterator>
class A;
class A{};
std::ostream & operator<<(std::ostream & out, const A & a)
{
    out << "A";
    return out;
}
int main()
{
    std::vector<A> v({ A(), A(), A() });
    //Prints: "A A A "
    std::copy(v.begin(), v.end(), std::ostream_iterator<A>(std::cout, " ")); 
    return 0;
}

这是不可以的:

#include <iostream>
#include <vector>
#include <iterator>
namespace N { class A; }
class N::A{};
std::ostream & operator<<(std::ostream & out, const N::A & a)
{
    out << "A";
    return out;
}
int main()
{
    std::vector<N::A> v({ N::A(), N::A(), N::A() });
    //Compiler error C2679:
    std::copy(v.begin(), v.end(), 
              std::ostream_iterator<N::A>(std::cout, " ")); 
    //But this is still ok and prints "A A A" as intended. 
    //Please, uncomment and try:
    /*
    for (std::vector<N::A>::iterator it = v.begin(); it != v.end(); ++it)
        std::cout << *it << " ";
    */
    return 0;
}

问题是std::copy找不到operator<<,没有ADL的帮助。它不知道你定义的operator<<

所以您需要将operator<<移动到类A声明的相同名称空间中,使ADL生效,然后可以找到operator<<

namespace N { 
    class A; 
    std::ostream & operator<<(std::ostream & out, const A & a);
}
class N::A{};
std::ostream & N::operator<<(std::ostream & out, const N::A & a)
{
    out << "A";
    return out;
}

生活

注意,对于第一种情况,它工作得很好,仍然是因为ADL。只是命名空间是全局命名空间(其中定义了Aoperator<<类)。