访问模板的受保护属性 Class
Accessing Protected Attribute of Template Class
以下代码不起作用,因为 t
成员函数无法访问其参数对象的属性。
如何将模板classA的模板方法t声明为A的友元函数?
对于没有template的代码,不需要声明friend。
代码:
template <typename T>
class A{
protected:
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);
}
编译器错误(icc test.cpp):
test.cpp(11): error #308: member "A<T>::a [with T=float]" (declared at line 4) is inaccessible
a = Bb.a;
^
detected during instantiation of "void A<T>::t(const A<T1> &) [with T=int, T1=float]" at line 17
没有模板的代码:
class A{
protected:
int a;
public:
A(int i){
a = i;
}
void t(const A & Bb){
a = Bb.a;
}
};
int main(void){
A Aa(5);
A 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<T>
和A<T1>
是两种不同的类型,如果T
和T1
是两种不同的类型。在这种情况下,您不妨将 A<T>
替换为 Foo
,将 A<T1>
替换为 Bar
。到那时应该很明显为什么你需要让 Foo 和 Bar 成为朋友(嗯,A<T>
和 A<T1>
其中 T
和 T1
不是同一类型) .
现在,看看你的错误:
detected during instantiation of "void A<T>::t(const A<T1> &) [with T=int, T1=float]"
它告诉你它正在 A<T>
类型的对象上调用 t()
函数,传入 A<T1>
类型的对象作为参数,其中 T=int
和T1=float
。这使得调用函数的对象与用作参数的对象的 class (A<float>
) 不同 class (A<int>
),并且由于它们' class 不同,如果不是朋友,他们就无法访问彼此的受保护成员。
以下代码不起作用,因为 t
成员函数无法访问其参数对象的属性。
如何将模板classA的模板方法t声明为A的友元函数?
对于没有template的代码,不需要声明friend。
代码:
template <typename T>
class A{
protected:
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);
}
编译器错误(icc test.cpp):
test.cpp(11): error #308: member "A<T>::a [with T=float]" (declared at line 4) is inaccessible
a = Bb.a;
^
detected during instantiation of "void A<T>::t(const A<T1> &) [with T=int, T1=float]" at line 17
没有模板的代码:
class A{
protected:
int a;
public:
A(int i){
a = i;
}
void t(const A & Bb){
a = Bb.a;
}
};
int main(void){
A Aa(5);
A 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<T>
和A<T1>
是两种不同的类型,如果T
和T1
是两种不同的类型。在这种情况下,您不妨将 A<T>
替换为 Foo
,将 A<T1>
替换为 Bar
。到那时应该很明显为什么你需要让 Foo 和 Bar 成为朋友(嗯,A<T>
和 A<T1>
其中 T
和 T1
不是同一类型) .
现在,看看你的错误:
detected during instantiation of "void A<T>::t(const A<T1> &) [with T=int, T1=float]"
它告诉你它正在 A<T>
类型的对象上调用 t()
函数,传入 A<T1>
类型的对象作为参数,其中 T=int
和T1=float
。这使得调用函数的对象与用作参数的对象的 class (A<float>
) 不同 class (A<int>
),并且由于它们' class 不同,如果不是朋友,他们就无法访问彼此的受保护成员。