Невозможно передать собственный объект из главного в функцию в присоединенном классе - PullRequest
2 голосов
/ 04 марта 2012

Я в основном и пытаюсь передать собственный объект в функцию, расположенную в другом классе.Я могу сделать этот вызов функции без проблем, когда обе функции находятся в одном файле.Смотрите мой пример кода для моей проблемы.Это не ссылка.В чем проблема и как я могу ее исправить?

Создатели Eigen, eigen.tuxfamily.org, рассказывают о том, как передавать собственные объекты в функции.К сожалению, я не смог расширить их пример за один файл.

Как передать объект:

http://eigen.tuxfamily.org/api/TopicPassingByValue.html

Как передать объект с шаблонами выражений:

http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html

main.cpp

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

MatrixMathTester.h:

#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 */

MatrixMathTester.cpp:

#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

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

К сожалению, вы не можете поместить определение вашей функции-члена шаблона в MatrixMathTester.cpp. Когда компилятор видит этот файл, он не знает, какие экземпляры вам понадобятся, поэтому он не генерирует тот, который вам нужен.

Если вы переместите определение в MatrixMathTester.h, тогда все будет хорошо. При компиляции main.cpp компилятор увидит тело шаблона и необходимые вам экземпляры и сделает все правильно.

1 голос
/ 04 марта 2012

Следующее реализует решение. Этот код был протестирован и работает.

MatrixMathTester.h:

#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 */

MatrixMathTester.cpp:

#include "MatrixMathTester.h"
using namespace std;
using namespace Eigen;

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