получить доступ к перегруженным шаблонам - PullRequest
1 голос
/ 29 апреля 2011

Эй, ребята, я не понимаю, как получить доступ к перегруженной шаблонной функции, подобной этой:

 template <typename T>
 friend istream& operator>> (istream& in, Matrix& right)
 {
      for(int i=0; i<right.rows*right.cols; i++)
        cin >> right.elements[i];
 }

с такой функцией, как:

 template <typename T>
 Matrix(T r, T c) {rows=r; cols=c; elements=new T[r*c];}

я смогнапример,

 Matrix <double> test(number, number) 

, но я понятия не имею, как использовать шаблонный оператор >> (или << или * или + ..), любая помощь будет принята.спасибо! </p>

Ответы [ 2 ]

0 голосов
/ 29 апреля 2011

Я предполагаю, что вы объявляете шаблон класса Matrix с аргументом типа T и хотите использовать определенный operator>> (вы должны сделать это более явным в вопросе):

template <typename T>
class Matrix {
   int rows, cols;
   T* elements;
public:
   Matrix( int c, int r );        // Do you really want the number of 
                                  // rows/columns to be of type `T`??

   // Note: removed template, you only want to befriend (and define)
   // a single operator<< that takes a Matrix<T> (the <T> is optional
   // inside the class braces
   friend std::istream& operator>>( std::istream& i, Matrix& m )
   {
       // m.rows, m.cols and m.elements is accessible here.
       return i;
   }
};

И тогда его довольно просто использовать:

Matrix<double> m( 1, 2 );
std::cin >> m; 

Это не единственный вариант, он просто самый распространенный.То есть в общем случае шаблон класса может использовать одну (не шаблонную) функцию (например, operator<< и operator>> как функции), как в приведенном выше коде, или он может захотеть использовать шаблон функции (все экземпляры) илиКонкретная реализация шаблона функции.

Я написал подробное объяснение различных опций и поведения здесь , и я рекомендую вам прочитать его.

0 голосов
/ 29 апреля 2011

Ну, единственный способ получить доступ - это что-то вроде этого:

operator>> <YourType> (istream, param);

, но это, конечно, сводит на нет все преимущества перегрузки оператора.Так что с этим определением оператора что-то не так.Возможно, Matrix - это тип шаблона, и он должен быть

template <typename T>
operator>>(istream & in, Matrix<T> & right);

Я не вижу использования параметра шаблона в определении вашего оператора, поэтому что-то не так с ним.

...