проблемы с классом шаблонов и пространством имен свободных функций - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть определенный класс (тривиальные включения, обертки препроцессора и т. Д., Но они есть):

In Matrix.h

namespace matrixmanip {
template<typename T>
class Matrix {
    public:
        void someFunc() const;
    //...
};

template<typename T>
void Matrix<T>::someFunc() const {
    //...
}
} // namespace matrixmanip

In bitTransform.h

#include "Matrix.h"

namespace matrixmanip {
Matrix<char> bitExpand(const Matrix<char> &mat);
} // namespace matrixmanip

In bitTransform.cpp

#include "bitTransform.h"

using namespace matrixmanip;

Matrix<char> bitExpand(const Matrix<char> &mat) {
    mat.someFunc();
    //...
}

In tester.cpp

#include "Matrix.h"
#include "bitTransform.h"

matrixmanip::Matrix<char> A ... // construct a character matrix, details of which are unimportant here
matrixmanip::Matrix<char> B = matrixmanip::bitExpand(A);

Однако, когда я компилирую и связываю так:

g++ -c tester.cpp
g++ -c bitTransform.cpp
g++ -Wall -O2 tester.o bitTransform.o -o tester

Я получаю неопределенную ошибку ссылки, в частности

/tmp/ccateMEK.o: In function `main':
tester.cpp:(.text+0xbf9): undefined reference to `matrixmanip::bitExpand(matrixmanip::Matrix<char> const&)'
collect2: error: ld returned 1 exit status

Почему я получаю эту ошибку?Мне кажется, что мое разрешение пространства имен в порядке, и моя связь в порядке ...

1 Ответ

0 голосов
/ 02 декабря 2018

bitExpand определяет свободную функцию в глобальном пространстве имен, а не в matrixmanip пространстве имен.Директива using не перемещает определения в используемое пространство имен.Вы должны поместить определение в правильное пространство имен напрямую:

namespace matrixmanip
{
    Matrix<char> bitExpand(const Matrix<char> &mat)
    {
        mat.someFunc();
       //...
    }
}
...