Почему у меня возникают проблемы при составлении шаблонного класса? - PullRequest
0 голосов
/ 10 мая 2019

Я застрял в этом коде некоторое время и не могу заставить его скомпилироваться, что именно я делаю не так? Если при компиляции присутствуют ошибки, пожалуйста, игнорируйте их, так как я могу это исправить самостоятельно. На данный момент я просто пытаюсь заставить его работать. Заранее спасибо.

#include <iostream>
#include <string.h>

//template <class t> class Matrix; //possible way of fixing the friend function.

using namespace std;
  template<class T, size_t NROWS, size_t NCOLS>
  std::ostream & operator<<(std::ostream &os, const Matrix<T,NROWS, NCOLS> &matrix);


template<class T, size_t NROWS = 1, size_t NCOLS = 1>
class Matrix{
public:
  Matrix(){}
  friend std::ostream &operator<< <>(std::ostream&os,const Matrix<T, NROWS, NCOLS> &matrix);

private:
  T container[NROWS][NCOLS];
};


template<class T,size_t NROWS, size_t NCOLS>
  std::ostream &operator<<(std::ostream &os,const Matrix<T,NROWS,NCOLS>&matrix){
  for(size_t i=0;i<NROWS;++i){
    for(size_t j=0;j<NCOLS;++j){
      os  <<matrix.container[i][j]<<" ";
    }
    os <<std::endl;
  }
  os <<std::endl;
}


int main(){
  Matrix<float, 10, 5> mat;
  cout << mat;
  return 0;
}

Ошибки из IDE, которые я использую, следующие:

main.cpp: 8: 51: ошибка: нет шаблона с именем 'Matrix' std :: ostream & operator << (std :: ostream & os, const Matrix & matrix); </p>

main.cpp: 15: 24: ошибка: шаблон не соответствует шаблону функции специализации 'operator <<' friend std :: ostream & operator << <> (std :: ostream & os, const Matrix & matrix);

main.cpp: 35: 32: note: при создании экземпляра класса шаблона 'Matrix', запрашиваемого здесь Matrix mat;

Ответы [ 3 ]

3 голосов
/ 10 мая 2019

Если вы раскомментируете строку 4 и измените ее следующим образом, ваш код компилируется:

template <class t, size_t, size_t> class Matrix; //possible way of fixing the friend function.

Похоже, ваша проблема в том, что заранее объявленные параметры шаблона Matrix не соответствуют определению Matrix, которое будет дано позже.

Кроме того, хотя код будет скомпилирован после этого исправления, есть предупреждение, которое вы, вероятно, также хотите исправить:

In function 'std::ostream& operator<<(std::ostream&, const Matrix<T, NROWS, NCOLS>&)':
31:1: warning: no return statement in function returning non-void [-Wreturn-type]
1 голос

Вам необходимо определить матрицу перед ее использованием:

template<class T, size_t NROWS = 1, size_t NCOLS = 1>
class Matrix;

и добавьте оператор return в оператор <<, который возвращает os. Вам также не нужно дублировать объявление оператора <<, вы можете объявить его только в теле класса. </p>

1 голос
/ 10 мая 2019
#include <cstddef>
#include <iostream>

template<typename, std::size_t, std::size_t> class Matrix;

template<typename T, std::size_t NROWS, std::size_t NCOLS>
std::ostream& operator<<(std::ostream &os, Matrix<T, NROWS, NCOLS> const &matrix)
{
    for (std::size_t row{}; row < NROWS; ++row, os.put('\n'))
        for (std::size_t col{}; col < NCOLS; ++col)
            os << matrix.container[row][col] << ' ';
    return os.put('\n');
}

template<typename T, std::size_t NROWS = 1, std::size_t NCOLS = 1>
class Matrix {
    T container[NROWS][NCOLS] = {};
    friend std::ostream& operator<< <>(std::ostream&, Matrix<T, NROWS, NCOLS> const&);
};

int main()
{
    Matrix<float, 10, 5> mat;
    std::cout << mat;
}

Пожалуйста, избавьтесь от заголовка C <string.h>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...