将特征库中的 VectorXi 传递给 class 方法

Passing a VectorXi from eigen library to class method

下面的主文件应该将一个 VectorXi 传递给我的 class,称为 Test,然后有一个方法可以用它做一些事情(为了演示,它只打印所有元素的总和):

#include <iostream>
#include <eigen3/Eigen/Dense>
#include "test.h"

using namespace std;
using namespace Eigen;

int main(int argc, const char * argv[]) {

    VectorXi m(3);
    m[0] = 1;
    m[1] = 2;
    m[2] = 6;

    Test test;
    test.mySum(m);

    return 0;
}

test.h

#ifndef __CPP_Playground__test__
#define __CPP_Playground__test__

#include <iostream>
#include <eigen3/Eigen/Dense>

using namespace std;
using namespace Eigen;

class Test {
public:
    void mySum(VectorXi vec); // Does not work. 
//    void mySum(VectorXi vec){cout << vec.sum() << endl;}; // Works.
};

#endif /* defined(__CPP_Playground__test__) */

和test.cpp

#include "test.h"

void mySum(VectorXi vec){
    cout << vec.sum() << endl;
};

在 OS X 10.10.2 上使用 Xcode 6.1.1 编译时,我收到错误消息:

Undefined symbols for architecture x86_64:
  "Test::mySum(Eigen::Matrix<int, -1, 1, 0, -1, 1>)", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1

我尝试在项目设置下使用 libstdc++ 而不是 libc++ 但它没有用。我通过 brew install eigen 使用 Homebrew 安装了 eigen 库。为什么它使用直接在 test.h 中定义的方法(见注释行)而不是在 test.cpp 中定义的方法?

这与Eigen无关,你只是在cpp文件中省略了class前缀Test::

void Test::mySum(VectorXi vec){
    cout << vec.sum() << endl;
}

此外,在适当的 C++ 中不需要尾随 ;,您应该通过引用将参数声明为 VectorXi &vec 来传递 vec 对象,或者更好地使用 Eigen::Ref<VectorXi> vec 允许通过引用传递兼容的对象。