【问题标题】:Friend functions and namespaces. Cannot access private member in class友元函数和命名空间。无法访问班级中的私人成员
【发布时间】:2016-03-16 17:30:33
【问题描述】:

所以我在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);
}

【问题讨论】:

    标签: c++ class templates friend


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      相关资源
      最近更新 更多