友元函数和命名空间。无法访问 class 中的私有成员

Friend functions and namespaces. Cannot access private member in class

所以我在 foo 命名空间中有一个 class,其中包含一个 friend 函数。现在我希望 friend 函数的定义位于不同的命名空间 bar 中,这样它就可以按照您在下面看到的方式调用。我得到的错误是无法访问私有成员 val

问题:为什么?

#include <iostream>

namespace foo 
{
    template<typename T>
    class myclass
    {
    private:
        T val;
    public:
        myclass(T v) : val(v) {}

        template<class U>
        friend void myfun(myclass<U>);
    };

    namespace bar 
    {
        template<class U>
        void myfun(myclass<U> a)
        {
            std::cout << a.val;
        }
    } //bar
} //foo

int main()
{
    foo::myclass<int> a(5);
    foo::bar::myfun(a);
}

您应该在友元声明之前声明 foo::bar::myfun 并使用适当的命名空间限定 (bar::):

namespace foo 
{
    template<typename T>
    class myclass;

    namespace bar 
    {
        template<class U>
        void myfun(myclass<U> a);
    } //bar

    template<typename T>
    class myclass
    {
    private:
        T val;
    public:
        myclass(T v) : val(v) {}

        template<class U>
        friend void bar::myfun(myclass<U>);
    };

} //foo

否则另一个名为 myfun 的函数将通过友元声明在 foo 命名空间中声明。