以下主文件应该将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中定义的方法?
答案 0 :(得分:1)
这与Eigen无关,你只是省略了cpp文件中的类前缀Test::
:
void Test::mySum(VectorXi vec){
cout << vec.sum() << endl;
}
此外,在正确的C ++中不需要尾随;
,你宁愿通过引用传递vec
对象,将参数声明为VectorXi &vec
,或者更好地使用{{1}允许通过引用传递兼容的对象。