C++ 访问模板类的受保护属性
以下代码不起作用,因为C++ 访问模板类的受保护属性,c++,templates,friend,C++,Templates,Friend,以下代码不起作用,因为t成员函数无法访问其参数对象的属性 如何将模板类A的模板方法t声明为A的友元函数 对于没有模板的代码,不需要声明friend 代码: 您可以使所有模板实例化成为彼此的朋友 template <typename T> class A { protected: // This makes A<int> friend of A<float> and A<float> friend of // A<
t
成员函数无法访问其参数对象的属性
如何将模板类A的模板方法t声明为A的友元函数
对于没有模板的代码,不需要声明friend
代码:
您可以使所有模板实例化成为彼此的朋友
template <typename T>
class A {
protected:
// This makes A<int> friend of A<float> and A<float> friend of
// A<int>
template <typename T1> friend class A;
T a;
public:
A(int i){
a = i;
}
template <typename T1>
void t(const A<T1> & Bb){
a = Bb.a;
}
};
int main(void){
A<int> Aa(5);
A<float> Bb(0);
Aa.t(Bb);
}
模板
甲级{
受保护的:
//这使一个和一个的朋友成为朋友
//A
A类模板;
Tα;
公众:
A(国际一){
a=i;
}
模板
无效t(常数A和B){
a=Bb.a;
}
};
内部主(空){
A Aa(5);
Bb(0);
Aa.t(Bb);
}
您可以使所有模板实例化成为彼此的朋友
template <typename T>
class A {
protected:
// This makes A<int> friend of A<float> and A<float> friend of
// A<int>
template <typename T1> friend class A;
T a;
public:
A(int i){
a = i;
}
template <typename T1>
void t(const A<T1> & Bb){
a = Bb.a;
}
};
int main(void){
A<int> Aa(5);
A<float> Bb(0);
Aa.t(Bb);
}
模板
甲级{
受保护的:
//这使一个和一个的朋友成为朋友
//A
A类模板;
Tα;
公众:
A(国际一){
a=i;
}
模板
无效t(常数A和B){
a=Bb.a;
}
};
内部主(空){
A Aa(5);
Bb(0);
Aa.t(Bb);
}
A
和A
是两种不同的类型,如果T
和T1
是两种不同的类型。在这种情况下,您不妨将A
替换为Foo
,将A
替换为Bar
。在这一点上,你需要结交Foo和Bar朋友的原因应该相当明显(ehm、A
和A
,其中T
和T1
不是同一类型)
现在,看看您的错误:
detected during instantiation of "void A<T>::t(const A<T1> &) [with T=int, T1=float]"
在“void A::t(const A&)[t=int,T1=float]的实例化过程中检测到”
它告诉您它正在调用A
类型的对象上的t()
函数,将A
类型的对象作为参数传入,其中t=int
和T1=float
。这使得调用函数的对象的类(a
)与用作参数的对象的类(a
)不同,并且由于它们是不同的类,因此它们不能访问彼此的受保护成员而不成为朋友。a
和a
是两种不同的类型,ifT
和T1
是两种不同的类型。在这种情况下,您不妨将A
替换为Foo
,将A
替换为Bar
。在这一点上,你需要结交Foo和Bar朋友的原因应该相当明显(ehm、A
和A
,其中T
和T1
不是同一类型)
现在,看看您的错误:
detected during instantiation of "void A<T>::t(const A<T1> &) [with T=int, T1=float]"
在“void A::t(const A&)[t=int,T1=float]的实例化过程中检测到”
它告诉您它正在调用
A
类型的对象上的t()
函数,将A
类型的对象作为参数传入,其中t=int
和T1=float
。这使得调用函数的对象的类(a
)与用作参数的对象的类(a
)不同,并且由于它们是不同的类,因此如果不是朋友,它们无法访问彼此的受保护成员。感谢您的解释。感谢您的解释。
detected during instantiation of "void A<T>::t(const A<T1> &) [with T=int, T1=float]"