C++ 在匿名命名空间中定义友元方法

C++ 在匿名命名空间中定义友元方法,c++,C++,以下程序出现错误: a.h namespace A { class TestA { private: int a = 1; protected: friend void printA(TestA); }; void printA(TestA ta); } a.cpp namespace A { namespace { // Works if this is removed. void printA(Te

以下程序出现错误:

a.h
namespace A {
    class TestA {
      private: 
        int a = 1;
      protected:
        friend void printA(TestA);
    };
    void printA(TestA ta);
}

a.cpp
namespace A {
namespace { // Works if this is removed. 
    void printA(TestA ta) {
        std::cout << ta.a << std::endl; 
    }
}
}

我不明白为什么在附加的匿名名称空间中会出现这种情况。

如果函数以前没有声明过,在类中声明它将把它放在周围的名称空间范围中(在您的示例中是
a
的范围)。实际上,您声明了
A::printA
函数。通过将定义放在不同的范围(a中的匿名名称空间)使其成为不同的函数。
   main.cpp: In function ‘void A::{anonymous}::printA(A::TestA)’:
   main.cpp:29:25: error: ‘int A::TestA::a’ is private within this context