Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Invalid use of template-name ‘Matrix’ without an argument list

Here is my Matrix.cpp file. (there's a separate Matrix.h file)

#include <iostream>
#include <stdexcept>

#include "Matrix.h"

using namespace std;

Matrix::Matrix<T>(int r, int c, T fill = 1)
{
  if (r > maxLength || c > maxLength) {
    cerr << "Number of rows and columns should not exceed " << maxLen << endl;
    throw 1;
  }

  if (r < 0 || c < 0) {
    cerr << "The values for the number of rows and columns should be positive" << endl;
    throw 2;
  }

  rows = r;
  cols = c;

  for (int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++)
      mat[i][j] = fill;

}

This gives the following

error: invalid use of template-name ‘Matrix’ without an argument list

What's the problem in my code?

EDIT: The class Matrix is defined with a template<class T>

EDIT: Here's my Matrix.h file:

#include <iostream>
#include <math.h>

#define maxLength 10;

using namespace std;

template <class T>

class Matrix
{
public:
    Matrix(int r, int c, T fill = 1);

private:
    int rows, cols;
        T mat[10][10];
};

And here's the Matrix.cpp file:

#include <iostream>
#include <stdexcept>

#include "Matrix.h"

using namespace std;

template<class T>
Matrix<T>::Matrix(int r, int c, T fill = 1)
{
}

This gives the following error:

Matrix.cpp:12:43: error: default argument given for parameter 3 of ‘Matrix::Matrix(int, int, T)’ Matrix.h:16:3: error: after previous specification in ‘Matrix::Matrix(int, int, T)’

What is wrong in my code?

like image 753
thameera Avatar asked Oct 21 '11 01:10

thameera


1 Answers

If your class is template then correct definition should be,

template<class T>
Matrix<T>::Matrix(int r, int c, T fill)  // don't give default argument
...

Also, don't forget to include this Cpp file where you use this class. Because in the case of templates, full body should be visible to all translation units.

Edit: After your edited question, I noticed that the error says it all.

You are not suppose to give the default argument inside the definition of the method. It's adequate to give in the declaration(which you already gave). Make your template definition as shown above and the error shall disappear.

like image 117
iammilind Avatar answered Sep 28 '22 08:09

iammilind