Пространство имен, унаследованное от включаемого файла в C ++ - PullRequest
0 голосов
/ 26 апреля 2018

Для статистического пакета мне нужно включить библиотеку числовых вычислений, и я выбрал Armadillo. Я хочу сохранить все зависимости от Armadillo в одном файле-обертке (чтобы можно было легко переключать числовые библиотеки). На данный момент оболочка для Armadillo под названием mixt_LinAlg.h содержит только:

#ifndef MIXT_LINALG_H
#define MIXT_LINALG_H

#include "mixt_Typedef.h"

#include <armadillo>

using namespace arma;

namespace mixt {

template<typename T>
using Matrix = Mat<T>;

template<typename T>
using Vector = Col<T>;

template<typename T>
using RowVector = Row<T>;

}

#endif // MIXT_LINALG_H

Таким образом, если я импортирую этот заголовок, у меня будет доступ к шаблонным классам Matrix, Vector и RowVector, без непосредственного импорта Armadillo. Теперь в Armadillo есть функция arma::approx_equal, которая, например, принимает два Col<T> и возвращает bool.

Если я просто вызываю эту функцию, используя approx_equal вместо arma::approx_equal, она компилируется с Clang на macOS. Но когда я компилирую его с GCC на Ubuntu, он жалуется, что не может найти approx_equal.

Как мне сделать approx_equal доступным для любого файла, включающего mixt_LinAlg.h, без необходимости ссылаться на пространство имен arma во включаемом файле?

1 Ответ

0 голосов
/ 26 апреля 2018

Добавьте в свой заголовок свою собственную функцию approx_equal в собственном пространстве имен, которая охватывает arma::approx_equal или любую другую реализацию.

Другими словами, добавьте что-то подобное заголовку для Armadillo:

... my_namespace::approx_equal (...) {
    return arma::approx_equal(...);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...