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);
}
我写了一个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);
}