将类成员函数声明为模板类的朋友

时间:2011-06-06 12:53:07

标签: c++

#include< iostream>  
using namespace std;  

template< class t>  
class X  
{  
  private:  
      t x;    

  public:  
        template< class u>  
         friend u y::getx(X< u> ); 

      void setx(t s)  
      {x=s;}  
           };      

class y   
{  
 public:  
     template< class t>  
     t getx(X< t> d)  
     {return d.x;}     
};  

int main()  
{  
    X< int> x1;  
    x1.setx(7);  
    y y1;  
    cout<< y1.getx(x1);    
    return 0;  
}       

上述程序在编译时显示y既不是函数也不是成员函数的错误,因此无法将其声明为朋友。在getx中将X作为朋友包含的方法是什么?

2 个答案:

答案 0 :(得分:2)

你必须安排这些类,以便声明为朋友的函数在类X之前实际可见。你还必须在y之前使X可见...

template< class t>  
class X;

class y   
{  
 public:  
     template< class t>  
     t getx(X< t> d)  
     {return d.x;}     
};

template< class t>  
class X  
{  
  private:  
      t x;    

  public:  
        template< class u>  
         friend u y::getx(X< u> ); 

      void setx(t s)  
      {x=s;}  
};      

答案 1 :(得分:1)

你应该在模板类X之前“转发声明”类y。即,只需输入:

y级; //前向声明

模板 X级......