C++ 在公共成员函数中访问私有成员变量

C++ 在公共成员函数中访问私有成员变量,c++,class,templates,C++,Class,Templates,在functionmyfun中,是否有一种方法可以访问rhs.var,而无需编写返回var的公共函数?另外,据我所知,发生这种情况是因为rhs可能是另一种类型。。。这是正确的吗 #include <iostream> template<class T> class foo { private: T var; public: foo(T v) : var(v) {} template<class Type> void myf

在function
myfun
中,是否有一种方法可以访问
rhs.var
,而无需编写返回
var
的公共函数?另外,据我所知,发生这种情况是因为
rhs
可能是另一种类型。。。这是正确的吗

#include <iostream>

template<class T>
class foo
{
private:
    T var;

public:
    foo(T v) : var(v) {}

    template<class Type>
    void myfun(foo<Type>& rhs)
    {
        auto i = rhs.var; //BOOM
    }
};

int main()
{
    foo<int> a = 5;
    foo<double> b = 2.2;

    a.myfun(b);
}
#包括
模板
福班
{
私人:
T-var;
公众:
foo(tv):var(v){}
模板
void myfun(foo和rhs)
{
自动i=rhs.var;//动臂
}
};
int main()
{
fooa=5;
foob=2.2;
a、 myfun(b);
}

您可以将第二种类型定义为:

template<class T>
class foo
{
private:
    T var;

public:
    foo(T v) : var(v) {}

    template<class Type>
    void myfun(foo<Type>& rhs)
    {
        auto i = rhs.var; //BOOM
    }

    template<class Type> 
      friend class foo;
};
模板
福班
{
私人:
T-var;
公众:
foo(tv):var(v){}
模板
void myfun(foo和rhs)
{
自动i=rhs.var;//动臂
}
模板
朋友班富;
};

建议的解决方案 您可以为私有成员变量提供公共访问器:

template<class T>
class foo {
  T var;
public:
  foo(T v) : var(v) {}
  T getVar() const { return var; }
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  template<class Type>
  void myfun(foo<Type>& rhs) {
    auto i = rhs.getVar();
                 ^^^^^^^^
  }
};
模板
福班{
T-var;
公众:
foo(tv):var(v){}
T getVar()常量{return var;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
模板
void myfun(foo和rhs){
auto i=rhs.getVar();
^^^^^^^^
}
};
或者,正如Dieter在评论中提到的那样,您可以让您的模板类成为朋友:

template<class T>
class foo {
  T var;
  template <class> friend class foo;
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
public:
  foo(T v) : var(v) {}
  template<class Type>
  void myfun(foo<Type>& rhs) {
    auto i = rhs.var;
  }
};
模板
福班{
T-var;
模板好友类foo;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
公众:
foo(tv):var(v){}
模板
void myfun(foo和rhs){
自动i=rhs.var;
}
};
概述
模板成员函数
myfun
未被授予访问类模板foo的私有成员变量
var
的权限的原因是编译器将
class foo
class foo
解释为完全不同的类类型,即使它们来自同一模板类定义。因此,作为不同的类类型,一个不能访问另一个的私有成员

您可以使用
模板好友类foo里面
foo
@Dieter Lücking这么简单。。。从未想过你甚至可以删除
U
模板好友类foo