2015-02-09 4 views
0

Следующий основной файл должен передать VectorXi в мой класс под названием Test, который затем метод, который делает что-то с ним (для демонстрации он просто печатает сумму всех элементов):Передачи VectorXi из собственной библиотеки методы класса

#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; 
}; 

При компиляции с Xcode 6.1.1 на OS X 10.10.2 Я получаю сообщение об ошибке:

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++ в настройках проекта, но это не сработало. Я установил собственную библиотеку с помощью Homebrew через brew install eigen. Почему он работает с методом, определенным в test.h (см. Комментарий), но не тогда, когда он определен в test.cpp?

ответ

1

Это не имеет ничего общего с Эйген, вы просто опустили префикс класса Test:: в файле CPP:

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

Кроме того, задняя ; не был нужен в исправном C++, и вы должны достаточно пройти vec объект по ссылке, объявляющий аргумент как VectorXi &vec или даже лучше использовать Eigen::Ref<VectorXi> vec, чтобы позволить совместимым объектам передавать по ссылке.

Смежные вопросы