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

C++ 打印用户定义类型的std::vector,c++,stl,std,C++,Stl,Std,请看下面的两个代码块。在第二个示例中,我刚刚将类A放入一个名称空间中。现在,我的大脑沸腾了,试图理解为什么第一块是可以的,而第二块不是。 对不起,这是一个密码。你能解释一下为什么吗?我使用微软编译器C++14。 请帮忙 这没关系: #include <iostream> #include <vector> #include <iterator> class A; class A{}; std::ostream & operator<<

请看下面的两个代码块。在第二个示例中,我刚刚将类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;
}
#包括
#包括
#包括
甲级;
A类{};

std::ostream&operator问题是
std::copy
找不到
operator-adl:
#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;
}
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;
}