C++命名空间“std”没有成员“format”,尽管有#include< format>

oiopk7p5  于 2023-07-01  发布在  其他
关注(0)|答案(5)|浏览(642)

我是C++的新手。我正在尝试将当前日期和时间存储为字符串变量。
this question中,我找到了答案,并安装了date.h库。
然而,当我尝试使用提供的代码时,我遇到了错误:
命名空间“std”没有成员“format”
尽管在脚本的顶部有#include <format>
我该怎么解决这个问题?
我在Windows 10上使用Visual Studio 2022,如果有帮助的话。
下面是我的代码:

#include <iostream>
#include <chrono>
#include <date.h>
#include <type_traits>
#include <format>

int main()
{
    std::cout << "The current time is ";
    auto start_time = std::format("{:%F %T}", std::chrono::system_clock::now());
    static_assert(std::is_same_v<decltype(start_time), std::string>{});
    std::cout << start_time << "\n";
}
n3schb8v

n3schb8v1#

std::format在C20标准中被添加到C中。除非使用C++20编译,否则不会有std::format

nhaq1z21

nhaq1z212#

截至2021年12月,std::format和其他一些C++20工具仅在Visual Studio 20192022中的/std:c++latest模式下可用。
Here is a quote:
作为实现C20的一部分,有一些后来的发现需要通过标准委员会的缺陷报告(DR)过程对ISO C20标准进行更改。这些功能的现有实现(pre-DR)在/std:clatest开关下可用。我们也在跟踪DR,并在/std:clatest下实现这些问题解决方案。我们的计划是在完成全套标准库DR的实现后,在/std:c++20开关下提供这些功能。
当Microsoft完成实施所有DR时,std::format将在/std:c++20交换机下可用。

6ss1mwsb

6ss1mwsb3#

对于那些遇到这个问题的人,使用GCC或clang。编译器仅部分支持c++20 https://en.cppreference.com/w/cpp/compiler_support/20中的所有新模块。

tquggr8v

tquggr8v4#

格式化作为std的一部分目前只在clang和MSVC上实现。因此,要使其在其他编译器(如g,apple clang)上工作,请使用fmt,这是format的实现。
下载fmt包,将其与您的文件沿着放入src文件夹,并在编译时包含它,同时指定您使用的是c++ 20。
你可以这样使用它作为参考:

g++ -I fmt/include -std=c++20 main.cpp
r1zhe5dt

r1zhe5dt5#

张贴在这里,因为这是在谷歌的顶部结果“错误C2039:'format_string':不是'std'的成员“。以防其他人有同样的问题。
所以这和最初的问题不完全一样。在我的例子中,std::format在VS2022中工作得很好,但不是std::format_stringstd::wformat_string
我在网上尝试了所有的建议和解决方案,但最终发现这是因为在旧版本的MSVC(14.34.31933)中,format头部用不同的名称实现了该功能:

template <class... _Args>
using _Fmt_string = _Basic_format_string<char, type_identity_t<_Args>...>;

但在最新版本(14.36.32532)中,它已更改为format_string

相关问题