c-朋友函数和名称空间.无法访问班级中的私人成员

因此,我在foo名称空间内有一个类,其中包括一个朋友函数.现在,我希望friend函数的定义在不同的名称空间栏中,以便您可以在下面看到它的方式.我得到的错误是私有成员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

否则,将通过朋友声明在foo名称空间中声明另一个名为myfun的函数.

上一篇:hdu4460 Friend Chains


下一篇:c – 访问受保护嵌套类的朋友