В Visual Studio 2022, C++20 я хочу напечатать текущее время с указанием года, месяца и дня.
Я попытался сделать это с помощью:
cout<<today << endl
Но я получил эту ошибку:
Error C2679 binary "<<": No operator found to accept right operand of type "std:: initializer_list<std:: Chrono:: time_point<std:: Chrono:: systemi_clock, std:: Chrono:: days>>" (or no acceptable conversion)
Мой код:
#include <time.h>
#include <iostream>
#include <format>
#include <string>
#include <ratio>
#include <chrono>
#include <iomanip>
using namespace std;
using namespace chrono;
int main()
{
auto today = { floor<days>(system_clock::now()) };
cout << today << endl;
system("pause");
}
если я попытаюсь присвоить todayyear_month_day, это тоже не сработает:
year_month_day ymd = today;
cout << ymd.year() << endl;
С этой ошибкой:
Error C2440: "Initialize": Unable to convert from "std:: initializer_list<std:: Chrono:: time_point<std:: Chrono:: systemi_clock, std:: Chrono:: days>>" to "std:: Chrono:: year_month_day"
Как мне это сделать ?
Или удалите = и сохраните { .... }.





Проблема:
В этой строке:
auto today = { floor<days>(system_clock::now()) };
Фигурные скобки ({ ... }) вокруг значения, используемого для инициализации today, заставляют auto вывести тип в std::initializer_list<...>.
std::cout не поддерживает его «из коробки».
Фактический тип, которым вам нужно today быть, — это std::chrono::time_point<...>.
Решение:
Решить ее можно одним из двух способов:
Удалите фигурные скобки, чтобы auto определил правильный тип:
auto today = floor<days>(system_clock::now());
Удалите знак =, чтобы он соответствовал единообразной инициализации:
auto today{ floor<days>(system_clock::now()) };
После такой инициализации today вы сможете использовать std::cout для его печати и назначить его year_month_day ymd.
Полный пример (со вторым решением):
#include <iostream>
#include <chrono>
int main()
{
auto today{ floor<std::chrono::days>(std::chrono::system_clock::now()) };
std::cout << today << std::endl;
std::chrono::year_month_day ymd = today;
std::cout << ymd.year() << std::endl;
}
Возможный результат:
2024-06-16
2024
Примечание:
Лучше избегать using namespace std;. См.: В чем проблема с «использованием пространства имен std;»?.
Удалите фигурные скобки (
{ ... }) вокруг значенияtoday. Это приводит к выводуautoкinitializer_list.