基模板化类中的 Statiс 变量,C++17 用法
Statiс variable in base templated class, C++17 usage
我使用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 解决方案。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 枚举环境变量的惯用C++14/C++17方法
- 如何使用变量模板比较 C++ 17 中的变量类型?
- 在 C++17 中初始化后可以更改行列变量吗?
- 追问:C++14/C++17 中的变量到底是什么?
- 在 C++17 中修改 constexpr 函数中的全局变量
- 基模板化类中的 Statiс 变量,C++17 用法
- 是否可以在 GCC 中使用带有 C++17 的显式寄存器变量?
- 为什么C 17中的全局内线变量和静态内线成员需要警卫
- 成员变量在 C++17 中标记为'static' static_assert?
- VS 中的 C++ 17 会导致 C++14 中不存在的变量(重新)评估错误
- MS 工作室 17 变量周围的堆栈已损坏
- C++-17变量模板:捕获回调参数的返回类型和参数类型
- 在c++ 17中,静态变量是否默认内联在模板中