在函数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);
}
答案 0 :(得分:4)
您可以为私有成员变量提供公共访问者:
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();
^^^^^^^^
}
};
或者就像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;
}
};
模板成员函数myfun
未被授予访问类模板foo的私有成员变量var
的原因是编译器将class foo<Type>
和class foo<T>
完全解释为不同的类类型,即使它们来自相同的模板类定义。因此,作为不同的类类型,不能访问另一个类的私有成员。
答案 1 :(得分:1)
你可以将第二种类型定义为像油炸一样:
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;
};