Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问模板类的受保护属性_C++_Templates_Friend - Fatal编程技术网

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
是两种不同的类型,if
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
)不同,并且由于它们是不同的类,因此如果不是朋友,它们无法访问彼此的受保护成员。

感谢您的解释。感谢您的解释。
detected during instantiation of "void A<T>::t(const A<T1> &) [with T=int, T1=float]"