【问题标题】:How to use template arguments for a template class outside of it?如何在模板类之外使用模板参数?
【发布时间】:2019-03-29 08:14:31
【问题描述】:

这是一个初学者的问题:

如何将模板参数用于与外部模板类一起工作的函数?

这是我使用模板的矩阵类。

template<typename T, int N, int M>
class matrix {
    T vals[N][M] = {};

public:
    matrix() {
        //sth
    }
};

现在我想为它类之外编写一个操作(乘法)。 这如何与模板参数一起使用?

matrix<?????????> operator*(matrix<<?????????>& m1, matrix<?????????>& m2) {
    //multiply code
}

问号写的地方我需要写什么? 相同? typename T, int N, int M?

【问题讨论】:

    标签: c++ templates matrix operator-overloading matrix-multiplication


    【解决方案1】:

    嗯...如果您想要经典的矩阵乘法...所以如果给定 D1xD2 矩阵乘以 D2xD3 矩阵,您需要 D1xD3 矩阵...

    template <typename T, std::size_t D1, std::size_t D2, std::size_t D3>
    matrix<T, D1, D3> operator* (matrix<T, D1, D2> const & m1,
                                 matrix<T, D2, D3> const & m2)
     {
       // ....
     }
    

    题外话:我建议(如您在我的示例中所见)对维度使用无符号值(可能是 std::size_t)。

    【讨论】:

      【解决方案2】:
      template<typename T, int N, int M>
      class matrix {
          T vals[N][M] = {};
      
      public:
          matrix() {
              //sth
          }
      };
      
      template <typename T, int N, int M>
      matrix<T, N, M> operator*(matrix<T, N, M> l, matrix<T, N, M> r) {
          return matrix<T, N, M>{};
      }
      

      直播:https://godbolt.org/z/5dJOXK

      您也可以将其作为朋友编写,而不必重新输入所有模板内容:

      template<typename T, int N, int M>
      class matrix {
          T vals[N][M] = {};
      
      public:
          matrix() {
              //sth
          }
      
          friend matrix<T, N, M> operator*(matrix<T, N, M> l, matrix<T, N, M> r) {
              return matrix<T, N, M>};
          }
      };
      

      或仅作为会员:

      template<typename T, int N, int M>
      class matrix {
          T vals[N][M] = {};
      
      public:
          matrix() {
              //sth
          }
      
          matrix<T, N, M> operator*(matrix<T, N, M> r) {
              return matrix<T, N, M>{};
          }
      };
      

      【讨论】:

      • 如果我可以提供一些改进; OP想要返回matrix,而不是T,矩阵乘法需要一个NxM矩阵和一个MxP矩阵来产生一个NxP矩阵
      • 你是完全正确的 - 虽然它并没有实质性地改变答案(关于语法),但我会马上修复它:)
      • 除非 N 和 M 相同,否则这对矩阵乘法没有多大意义。
      • 好吧,不管怎样——核心问题是模板的语法是什么......这里的业务逻辑是什么意思实际上只是一个红鲱鱼。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多