Friend函数和命名空间.无法访问类中的私有成员

Friend functions and namespaces. Cannot access private member in class

本文关键字:成员 访问 函数 命名空间 Friend      更新时间:2023-10-16

所以我在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命名空间中声明。