C++ 无法将特征对象从main传递到附加类中的函数

C++ 无法将特征对象从main传递到附加类中的函数,c++,eigen,C++,Eigen,我主要是想把一个本征对象传递给另一个类中的函数。当两个函数都在同一个文件中时,我可以毫无问题地进行此函数调用。有关我的问题,请参阅示例代码。它没有链接。问题是什么,我如何解决 Eigen的制作者Eigen.tuxfamily.org讨论了如何将Eigen对象传递给函数。不幸的是,我无法将其示例扩展到单个文件 如何传递对象: 如何通过表达式模板传递对象: main.cpp #包括 #包括 #包括 #包括“MatrixMathTester.h” 使用名称空间std; 使用名称空间特征; int

我主要是想把一个本征对象传递给另一个类中的函数。当两个函数都在同一个文件中时,我可以毫无问题地进行此函数调用。有关我的问题,请参阅示例代码。它没有链接。问题是什么,我如何解决

Eigen的制作者Eigen.tuxfamily.org讨论了如何将Eigen对象传递给函数。不幸的是,我无法将其示例扩展到单个文件

如何传递对象:

如何通过表达式模板传递对象:

main.cpp
#包括
#包括
#包括
#包括“MatrixMathTester.h”
使用名称空间std;
使用名称空间特征;
int main(int argc,字符**argv)
{
MatrixMathTester matrixMathObject;
矩阵xSD输出矩阵(2,2);

outputMatrix不幸的是,您不能将模板成员函数的定义放在MatrixMathTester.cpp中。当编译器看到该文件时,它不知道您需要什么样的实例化,因此它不会生成您需要的实例化


如果您将定义移动到MatrixMathTester.h,那么一切都会好起来。编译main.cpp时,编译器将看到模板的主体和您需要的实例化,并将做正确的事情。

以下实现了解决方案。此代码已经过测试,可以正常工作

MatrixMathTester.h:
我认为这里没有足够的信息来回答这个问题。关键似乎隐藏在一个你没有显示(可能无法合理显示)的相关性标题中,即
。尚不清楚您的
矩阵xD outputMatrix;
MatrixMathTester::internalMatrixMath
函数的模板参数之间的关系。因为我们没有
头,我们无法进行实验来找出答案。尤其是,我们无法轻松地发现当它都在一个函数中时为什么工作文件,但不是几个文件。如果你幸运的话,其他人遇到了这个问题,但是…我可以重现这个问题;我还没有找到解决方案。谢谢你的帮助。艾伦·斯托克斯的回复提供了一个解决方案,但是如果你遇到任何我想听到你的消息。谢谢。你的解决方案有效。但是,这意味着我会吗永远不能再使用带有Eigen和.cpp的类了?问题是与模板函数有关,根本与Eigen没有直接关系。因此,这取决于您需要做什么。
#include <cstdlib>
#include <iostream>
#include <Eigen>
#include "MatrixMathTester.h"
using namespace std;
using namespace Eigen;

int main(int argc, char** argv)
{
    MatrixMathTester matrixMathObject;

    MatrixXd outputMatrix(2, 2);
    outputMatrix << 22, 11, 22, 11;

    matrixMathObject.internalMatrixMath(outputMatrix);

    return 0;
}
#ifndef MATRIXMATHTESTER_H
#define MATRIXMATHTESTER_H

#include <iostream>
#include <Eigen>
using namespace Eigen;

class MatrixMathTester {
public:
    MatrixMathTester();
    MatrixMathTester(const MatrixMathTester& orig);
    virtual ~MatrixMathTester(); 

    template <typename Derived>
    void internalMatrixMath(const MatrixBase<Derived>& inputMatrix);
};
#endif /* MATRIXMATHTESTER_H */
#include "MatrixMathTester.h"
using namespace std;
using namespace Eigen;

MatrixMathTester::MatrixMathTester(){}
MatrixMathTester::MatrixMathTester(const MatrixMathTester& orig){}
MatrixMathTester::~MatrixMathTester(){}

template <typename Derived>
void MatrixMathTester::internalMatrixMath(const MatrixBase<Derived>& inputMatrix)
{
cout << "InputMatrix" << endl << inputMatrix << endl;
}
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-MacOSX/testinggrounds
mkdir -p build/Debug/GNU-MacOSX
rm -f build/Debug/GNU-MacOSX/main.o.d
g++ -I/Users/folder/Documents/CPP_Librarys/eigen/Eigen   -c -g \
    -I../../../CPP_Library/eigen/Eigen -MMD -MP -MF 
    build/Debug/GNU-MacOSX/main.o.d -o build/Debug/GNU-MacOSX/main.o main.cpp
mkdir -p build/Debug/GNU-MacOSX
rm -f build/Debug/GNU-MacOSX/MatrixMathTester.o.d
g++ -I/Users/folder/Documents/CPP_Librarys/eigen/Eigen   -c -g -MMD -MP \
    -MF build/Debug/GNU-MacOSX/MatrixMathTester.o.d -o \
    build/Debug/GNU-MacOSX/MatrixMathTester.o MatrixMathTester.cpp
mkdir -p dist/Debug/GNU-MacOSX
g++ -I/Users/folder/Documents/CPP_Librarys/eigen/Eigen    -o \
    dist/Debug/GNU-MacOSX/testinggrounds build/Debug/GNU-MacOSX/main.o \
    build/Debug/GNU-MacOSX/MatrixMathTester.o  
Undefined symbols:
  "void MatrixMathTester::internalMatrixMath<Eigen::Matrix<double, -1, -1, 0, -1, -1>
   >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&)",
referenced from:
  _main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
#ifndef MATRIXMATHTESTER_H
#define MATRIXMATHTESTER_H

#include <iostream>
#include <Eigen>
using namespace Eigen;
using namespace std;

class MatrixMathTester {
public:
    MatrixMathTester();
    MatrixMathTester(const MatrixMathTester& orig);
    virtual ~MatrixMathTester();

    template <typename Derived>
    void internalMatrixMath(const MatrixBase<Derived>& inputMatrix) 
    {
        cout << "InputMatrix" << endl << inputMatrix << endl;
    }
};
#endif  /* MATRIXMATHTESTER_H */
#include "MatrixMathTester.h"
using namespace std;
using namespace Eigen;

MatrixMathTester::MatrixMathTester(){}
MatrixMathTester::MatrixMathTester(const MatrixMathTester& orig){}
MatrixMathTester::~MatrixMathTester(){}