【问题标题】:Remove non-generic template parameter on C删除 C 上的非泛型模板参数
【发布时间】:2012-12-12 18:54:53
【问题描述】:

我正在使用 ublas 作为我的矩阵代码,但我希望它是可交换的,所以我这样做了:

typedef boost::numeric::ublas::matrix<double> cMatrix;

今天,我需要将其中一些矩阵更改为有界大小,所以我也会有这个:

typedef boost::numeric::ublas::bounded_matrix<double, 3, 3> Matrix3d;

问题是我的旧函数声明:

void cClass::function(int param1,
                      int param2,
                      cMatrix &param3,
                      int param4);

不再有效。它给了我:

error : a reference of type "cMatrix &" (not const-qualified) cannot be initialized with a value of type "Matrix3d"

我设法通过将声明更改为:

template <class A>
void cClass::function(int param1,
                      int param2,
                      boost::numeric::ublas::matrix<double, boost::numeric::ublas::row_major, A> &param3,
                      int param4);

问题是我的定义是一个cpp文件,所以我必须在cpp中做这样的事情:

void dummyFunc()
{
  cClass dummy(NULL, NULL);
  cMatrix c;
  Matrix12d d12;
  dummy.function(-1, -1, c, -1);
  dummy.function(-1, -1, d12, -1);
}

有什么方法可以避免使用 dummyFunc 或以其他方式泛化函数吗?

【问题讨论】:

  • 那个虚拟函数的目的是什么?您是否尝试强制模板实例化,否则会出现链接器错误?
  • 我尝试为 template void cClass ::function(int param1, int param2, cMatrix &amp;param3, int param4); template void cClass ::function(int param1, int param2, Matrix12d &amp;param3, int param4); 更改虚拟对象,但它继续给出链接器错误。

标签: c++ templates typedef boost-ublas


【解决方案1】:

如果matrixbounded_matrix 具有完全相同的API,您可以抽象类型并使用可变参数模板概括cClass::function

template<template <class...> class M, class... Arg>
void cClass::function(int param1,
                      int param2,
                      M<Arg...> &param3,
                      int param4);

【讨论】:

    【解决方案2】:

    我建议对 Thibaut 的(正确)答案进行改进:

    template<class UblasMatrix, typename /*Dummy*/ = UblasMatrix::array_type>
    void cClass::function(int param1,
                          int param2,
                          UblasMatrix &param3,
                          int param4);
    

    感谢 SFINAE,第二个模板参数只是为了(几乎)确定您正在使用某种 ublas 矩阵而不是其他东西调用函数(例如,假设为 std::vector&lt;doubel&gt;)。这样可以避免混淆错误消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      相关资源
      最近更新 更多