Проблема в вызове шаблонного метода собственного логгера

Идея логгера заключается в том, что он идёт отдельным модулем и должен работает через стандартные макросы qDebug() и т.п. из #include <QDebug> без обратных зависимостей к логгируемым частям приложения.
Суть логгера в том, что бы разделять логгируемые данные не только по типу сообщения, но и по контексту логов и была возможность принимать логи с разных мест поток/и и отправлять в разные места.
Пример: Есть 2 интерфейса - Ethernet и USB - у них общий контекст logNetwork. Вся информация с этим контекстом должна отправляться в какую-нибудь консоль и одновременно в файл.
Выбор типа лога заключается на основе QLoggingCategory категорий и типе QtMsgType Qt сообщения. В разных файлах программы я определяю категорию для логгирования при помощи Q_LOGGING_CATEGORY в .cpp файле и Q_DECLARE_LOGGING_CATEGORY в .h файле. QtMsgType

Для реализации было создано 2 класса:
Шаблонный класс, который определяет уникальный сигнал для каждого типа контекста (категории).

template <const QMessageLogContext &context>
class LogHelper : public QObject {
    Q_OBJECT
public:
    constexpr LogHelper() : QObject(nullptr) {  }
    inline void exec(const QString &msg) { emit log(msg); }
signals:
    void log(const QString &msg);
};

Виртуальный класс, определяющий метод типаQtMessageHandler, который я в последствии передаю qInstallMessageHandler() в main до инициализации приложения qt.

class Logger
{
    static void log(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
        LogHelper<context> helper;
        helper.exec(qFormatLogMessage(type, context, msg));
    }
public:
    virtual ~Logger() = 0;
};

Проблема реализации заключается в том, что при инициализации LogHelper с возникает ошибка "non-type template argument refers to object 'context' that does not have linkage"
Я не могу понять её причины, ведь все контексты известны на момент компиляции, т.к. описываются в .cpp файлах через Q_LOGGING_CATEGORY
Как можно исправить это ошибку, или есть иная более подходящая реализация данной задачи? Из вариантов решения мне только приходит специализация шаблонов на месте определения категории логирования, или же полностью отойти от стандартных qDebug() и т.п. и просто определять свой поток для каждой категории, что бы потом его выводить куда нужно.


Ответы (0 шт):