将VectorXi从特征库传递给类方法

时间:2015-02-09 10:29:24

标签: c++ compiler-errors eigen

以下主文件应该将VectorXi传递给我的名为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安装了特征库。为什么它使用test.h中直接定义的方法(参见注释行),而不是在test.cpp中定义的方法?

1 个答案:

答案 0 :(得分:1)

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

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

此外,在正确的C ++中不需要尾随;,你宁愿通过引用传递vec对象,将参数声明为VectorXi &vec,或者更好地使用{{1}允许通过引用传递兼容的对象。