朋友功能和命名空间。无法在课堂上访问私人会员

时间:2015-12-10 22:17:03

标签: c++ class templates 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);
}

1 个答案:

答案 0 :(得分:4)

您应该在朋友声明之前声明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命名空间中声明。