基模板化类中的 Statiс 变量,C++17 用法

Statiс variable in base templated class, C++17 usage

本文关键字:变量 C++17 用法 Stati      更新时间:2023-10-16

我使用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;
}

叮当警报链接器错误:

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

我不知道如何为每个 CLoggerTxtBase 实例制作单个_default_output_format实例......因为模板我不使用.类层次结构的 CPP 文件。 看起来它必须以某种方式内联... 提前感谢!

UPD我的同事给了我一个想法,即使用返回字符串引用的静态函数。这是一个解决方案,但我仍然想知道是否可以以这种方式使用静态变量。

感谢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 解决方案。