class 使用模板化特征矩阵

class using templated eigen matrix

我写了一个class喜欢

class abc
{
public:
    template <typename Derived >
    abc( const Eigen::MatrixBase < Derived > &matA,
         const Eigen::MatrixBase < Derived > &matB,
         Eigen::MatrixBase < Derived > &matC );
};

template <typename Derived >
abc::abc( const Eigen::MatrixBase < Derived > &matA,
          const Eigen::MatrixBase < Derived > &matB,
          Eigen::MatrixBase < Derived > &matC )
{
    matC.derived().resize( matA.rows(), matA.cols() );

    for( int r = 0; r < matA.rows(); r++ )
    {
        for( int c = 0; c < matA.cols(); c++ )
        {
            matC(r,c) = log( matA(r,c) )/log( matB(r,c) );
        }
    }
}

但是在 main 中使用 class abc 时 我收到未定义的引用错误

typedef Eigen::Matrix< float, Eigen::Dynamic, Eigen::Dynamic > Matrix_Float;
main()
{
Matrix_Float matA, matB, matC;
// put values in matA, matB
    abc cls_abc( matA, matB, matC );
}

错误是 错误:未定义对 `abc::abc < Eigen::Matrix < float, -1, -1, 0, -1, -1> > (Eigen::MatrixBase < Eigen::Matrix < float, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase < Eigen::Matrix < float, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase < Eigen::Matrix < float, -1, -1, 0, -1, -1> > &)'

class定义的语法有什么问题吗?

请帮忙。

你有一些问题。首先,对于模板 classes,您需要在声明中提供可用的实现(即在 .h 文件中,而不是 .cpp 中)。其次,您希望 class 被模板化,请注意构造函数。三、使用模板化时class,需要指定模板参数

将所有这些放在一起,您的 class (.h) 文件应该如下所示:

template <typename Derived > class abc  // Template the class
{
public:
    //template <class Derived > // Don't put this here, but above
    abc(
        const Eigen::MatrixBase < Derived > &matA,
        const Eigen::MatrixBase < Derived > &matB,
        Eigen::MatrixBase < Derived > &matC);
};

template <typename Derived >
abc<Derived>::abc(
    const Eigen::MatrixBase < Derived > &matA,
    const Eigen::MatrixBase < Derived > &matB,
    Eigen::MatrixBase < Derived > &matC)
{
    matC.derived().resize(matA.rows(), matA.cols());

    for (int r = 0; r < matA.rows(); r++)
    {
        for (int c = 0; c < matA.cols(); c++)
        {
            matC(r, c) = log(matA(r, c)) / log(matB(r, c));
        }
    }
}

你的 main() 应该是这样的:

int main(int argc, char* argv[]) // just "main()" is so passé
{
    Matrix_Float matA, matB, matC;
    // put values in matA, matB
    abc<Matrix_Float> cls_abc(matA, matB, matC);
}