Mor*_*hai 6 c++ formatting templates compiler-errors fmt
我正在接受一些人的建议并查看 fmt 库:http : //fmtlib.net
它似乎具有我需要的功能,并声称支持%p(指针),但是在编译我使用 %p 的代码时,我得到一长串模板错误(难以理解)。我会在这结束时发布它们。
如果我拉出%p和相应的指针参数,那么它会在 VS2017 c++17 上编译。
但是,我不知道如何解码模板错误,或者首先了解为什么它不接受%p参数。
我试过将论点转换为(void*)- 同样的问题。
我试过在格式化程序中使用 python 样式语法{}- 同样的问题。
我已经将 %p 位与其他格式分开了 - 同样的问题。
我看到有对用户类型的支持 - 但在这种情况下,我只想将其作为原始指针值输出。我可以跳过它,毕竟指针地址有多大价值,真的吗?但这当然意味着在从sprintfto转换的过程中需要做更多的工作fmt::format来寻找所有 %p 并“对它们做点什么”,例如省略它们。
但是文档似乎表明支持 %p - http://fmtlib.net/latest/syntax.html(大约向下的 3/4 - 搜索“指针”或“p”)。
这是调用函数:(注意:pAccels声明为const ACCEL *)
m_hAccel = ::CreateAcceleratorTable(const_cast<LPACCEL>(pAccels), (int)count);
if (!m_hAccel)
{
auto error = GetLastError();
throw CWinAPIErrorException(__FUNCTION__, "CreateAcceleratorTable", fmt::format("%p,%u", pAccels, count), error);
}
Run Code Online (Sandbox Code Playgroud)
这是诊断性的排泄物:
1>c:\users\steve\source\fmt\include\fmt\core.h(1073): error C2825: 'fmt::v5::internal::get_type<Context,Arg>::value_type': must be a class or namespace when followed by '::'
1> with
1> [
1> Context=fmt::v5::basic_format_context<std::back_insert_iterator<fmt::v5::internal::buffer<char>>,char>,
1> Arg=const ACCEL *
1> ]
1>c:\users\steve\source\fmt\include\fmt\core.h(1081): note: see reference to class template instantiation 'fmt::v5::internal::get_type<Context,Arg>' being compiled
1> with
1> [
1> Context=fmt::v5::basic_format_context<std::back_insert_iterator<fmt::v5::internal::buffer<char>>,char>,
1> Arg=const ACCEL *
1> ]
1>c:\users\steve\source\fmt\include\fmt\core.h(1190): note: see reference to function template instantiation 'unsigned __int64 fmt::v5::internal::get_types<Context,const ACCEL*,size_t>(void)' being compiled
1> with
1> [
1> Context=fmt::v5::basic_format_context<std::back_insert_iterator<fmt::v5::internal::buffer<char>>,char>
1> ]
1>c:\users\steve\source\fmt\include\fmt\core.h(1190): note: while compiling class template member function 'unsigned __int64 fmt::v5::format_arg_store<fmt::v5::basic_format_context<std::back_insert_iterator<fmt::v5::internal::buffer<Char>>,Char>,const ACCEL *,size_t>::get_types(void)'
1> with
1> [
1> Char=char
1> ]
1>c:\users\steve\source\fmt\include\fmt\core.h(1478): note: see reference to class template instantiation 'fmt::v5::format_arg_store<fmt::v5::basic_format_context<std::back_insert_iterator<fmt::v5::internal::buffer<Char>>,Char>,const ACCEL *,size_t>' being compiled
1> with
1> [
1> Char=char
1> ]
1>c:\users\steve\source\tbx\wapi\acceleratortable.cpp(58): note: see reference to function template instantiation 'std::basic_string<char,std::char_traits<char>,std::allocator<char>> fmt::v5::format<char[6],const ACCEL*,size_t,0>(const S (&),const ACCEL *const &,const size_t &)' being compiled
1> with
1> [
1> S=char [6]
1> ]
1>c:\users\steve\source\fmt\include\fmt\core.h(1073): error C2510: 'value_type': left of '::' must be a class/struct/union
1>c:\users\steve\source\fmt\include\fmt\core.h(1073): error C2065: 'type_tag': undeclared identifier
1>c:\users\steve\source\fmt\include\fmt\core.h(1073): error C2131: expression did not evaluate to a constant
1>c:\users\steve\source\fmt\include\fmt\core.h(1073): note: a non-constant (sub-)expression was encountered
1>c:\users\steve\source\fmt\include\fmt\core.h(1197): error C2131: expression did not evaluate to a constant
1>c:\users\steve\source\fmt\include\fmt\core.h(1082): note: failure was caused by non-constant arguments or reference to a non-constant symbol
1>c:\users\steve\source\fmt\include\fmt\core.h(1082): note: see usage of 'value'
Run Code Online (Sandbox Code Playgroud)
要格式化指针,您可以将其强制转换为void*:
std::string s = fmt::format("{},{}", static_cast<void*>(pAccels), count);
Run Code Online (Sandbox Code Playgroud)
或将其包裹起来fmt::ptr:
std::string s = fmt::format("{},{}", fmt::ptr(pAccels), count);
Run Code Online (Sandbox Code Playgroud)
Godbolt 的工作示例:https ://godbolt.org/z/sCNbjr
请注意,format使用类似 Python 的格式字符串语法,而不是printf's 并返回一个std::string对象。