【问题标题】:Overload operator () with templates使用模板重载运算符 ()
【发布时间】:2023-03-16 01:47:02
【问题描述】:

我正在做一个需要使用模板完成的作业:它是一个矩阵类。

其中一个告诉我重载operator ()(int r, int c);,这样我就可以使用obj(a, b); 访问我的数据或使用obj(a, b)=100; 更改它。

我的班级模板是template<class T, int C, int R>; 然后我在公共范围内创建了我的班级:

T& operator()(int r, int c);//LINE 16

实现很简单。

我尝试了两种方式:

template <class T>
T& Matrix::operator()(int r, int c){
    return matrixData[r][c];
}

template <class T, int C, int R>
T& Matrix::operator()(int r, int c){ 
    return matrixData[r][c];
}

在最后一个我得到错误告诉我:

16: Error: expected type-specifier before '(' token

上面的第 16 行有一个注释错误:

no 'T& Matrix<T, C, R>::operator()(int, int)' member function declared in class 'Matrix<T, C, R>'

【问题讨论】:

    标签: c++ templates operator-overloading


    【解决方案1】:

    班级是template&lt;class T, int C, int R&gt; class Matrix {...}:

    以下对我有用:

    #include <iostream>
    
    template<typename T, int R, int C>
    class Matrix {
      T data[R][C];
    public:
      T& operator()(int r, int c);
    };
    
    template <typename T, int R, int C>
    T& Matrix<T, R, C>::operator()(int r, int c) {
      return data[r][c];
    }
    
    int main() {
      Matrix<int, 3, 4> m;
      m(0, 1) = 42;
      std::cout << m(0, 1) << std::endl;
    }
    

    【讨论】:

    • 它说:参数数量错误。我创建了一些朋友运营商,他们工作得很好,但现在我无法解决这个问题。
    • @demonofnight:我(已编辑)答案中的代码对我来说编译得很好。
    • 如果我只保留 class T 它不起作用,看来我需要放置 。它告诉我参数的数量应该是 3 而不是 1。类是 template class Matrix{...} 如果我用所有 3 个参数修复它,我的主要告诉我我有一个未定义的对 matrix::operator()(int, int) 的引用
    • 谢谢,现在的问题是,编译器告诉我,我对矩阵::operator()(int, int) 有一个未定义的引用,所以我正在寻找如果是因为实施或者我做错了什么/
    【解决方案2】:

    如果我理解正确,您错过了Matrix 上的类型:

    template <class T>
    T& Matrix<T>::operator()(int r, int c){
        return matrixData[r][c];
    }
    
    template <class T, int C, int R>
    T& Matrix<T>::operator()(int r, int c){ 
        return matrixData[r][c];
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-03
      • 2023-03-03
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      相关资源
      最近更新 更多