模板名称“Matrix”使用无效;没有参数列表

发布于 2024-12-11 15:47:48 字数 1557 浏览 0 评论 0原文

这是我的 Matrix.cpp 文件。 (有一个单独的 Matrix.h 文件)

#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;

}

这给出了以下内容

错误:在没有参数列表的情况下模板名称“Matrix”的使用无效

我的代码有什么问题?

编辑:类 Matrix 是用 template 定义的

编辑: 这是我的 Matrix.h 文件:

#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];
};

这是 Matrix.cpp 文件:

#include <iostream>
#include <stdexcept>

#include "Matrix.h"

using namespace std;

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

这给出了以下错误:

Matrix.cpp:12:43: 错误: 为参数 3 给出的默认参数 'Matrix::Matrix(int, int, T)' Matrix.h:16:3: 错误:在上一个之后 'Matrix::Matrix(int, int, T)' 中的规范

我的代码有什么问题?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

混吃等死 2024-12-18 15:47:48

如果您的类是模板,那么正确的定义应该是,

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

另外,不要忘记在使用此类的地方包含此 Cpp 文件。因为在模板的情况下,全文应该对所有翻译单元可见。

编辑:编辑问题后,我注意到错误说明了一切。

您不应该在方法的定义中给出默认参数。提供声明就足够了(您已经提供了)。如上所示进行 template 定义,错误就会消失。

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.

云裳 2024-12-18 15:47:48

你应该这样写:

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

是的,这很乏味。这可能不是一个好主意
源文件中的模板定义,请参考
http://www.parashift.com/c++-faq-lite /templates.html#faq-35.12

所以最简单的方法就是放置模板成员的定义
在头文件中的类模板定义内。

You should write as:

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

Yes, it's tedious. And it might not be a good idea to put
the template definitions in the source file, refer to
http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12

So the easiest way is to put the definitions of the template members
inside the class template definition in header file.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文