Статическая переменная в базовом шаблонном классе, использование C ++ 17 - PullRequest
0 голосов
/ 04 октября 2019

Я использую C ++ 17 и пытаюсь сделать иерархию таких классов (упрощенной):

template<typename TChar>
class CLoggerTxtBase {
public:
    using TString = std::basic_string<TChar>;
    static TString _default_output_format;
};

using CLoggerTxt = CLoggerTxtBase<char>;
template<> std::basic_string<char> CLoggerTxt::_default_output_format{ "%F %T" };

using CLoggerWTxt = CLoggerTxtBase<wchar_t>;
template<> std::basic_string<wchar_t> CLoggerWTxt::_default_output_format{ L"%F %T" };

template<typename TChar> class CLoggerTxtFile {};
template<typename TChar> class CLoggerTxtCout {};

После этого у меня есть две функции, которые используют оба класса:

funct1(){
    CLoggerTxtCout<wchar_t> log;
}
funct2() {
    CLoggerTxtFile<wchar_t> log;
}

clang оповещает об ошибках компоновщика:

duplicate symbol 'Logger::CLoggerTxtBase<wchar_t>::_default_output_format' in:
    CMakeFiles/test_logger.dir/src/logger_txt_file.cpp.o
    CMakeFiles/test_logger.dir/src/logger_txt_cout.cpp.o

Я понятия не имею, как создать отдельный экземпляр _default_output_format для каждого экземпляра CLoggerTxtBase ... Из-за шаблона я не использую .CPP-файлы для иерархии классов. Похоже, что это должно быть как-то встроено ... Заранее спасибо!

UPD Мой коллега дал мне идею использовать статические функции, которые возвращают ссылку на строку. Это решение, но я все еще хотел бы знать, возможно ли использовать статические переменные таким образом.

1 Ответ

0 голосов
/ 04 октября 2019

Благодаря VTT. Я попробовал код ниже:

using CLoggerTxt = CLoggerTxtBase<char>;
template<> inline std::basic_string<char> CLoggerTxt::_default_output_format{ "%F %T" };

using CLoggerWTxt = CLoggerTxtBase<wchar_t>;
template<> inline std::basic_string<wchar_t> CLoggerWTxt::_default_output_format{ L"%F %T" };

Это правильное решение C ++ 17.

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