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

Dei*_*Dei 2 c++ templates class friend

所以我有一个class内部foo命名空间,其中包含一个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);
}
Run Code Online (Sandbox Code Playgroud)

vit*_*aut 5

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
Run Code Online (Sandbox Code Playgroud)

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