为什么我可以在 Windows 上编译和使用 std::cout << std::chrono::year_month_day 数据类型,但在 macOS 上的 VS Code 中我无法编



我想我的问题很直接,但如果我仍然不善于解释,请原谅我。基本上,我在学习C++,并在C++20中使用<chrono>将日期值存储在一个简单的Person类中。问题是,我的M1 MacBook Pro上的源代码使用的是标准设置为C++20的VS代码,它在<lt;在std::cout之后和yearMonthDay之前的这行代码std::cout << yearMonthDay << std::endl;使用终端中的clang++构建,我得到了这个错误error: invalid operands to binary expression ('std::__1::ostream' (aka 'basic_ostream<char>') and 'std::__1::chrono::year_month_day')然而,在我的Visual Studio 2019中的Windows工作站上,这个代码满足intellisense fine,成功编译和链接,并按预期输出我设置的年月日。

为什么这些代码在Windows中的Visual Studio 2019上有效,而在macOS(M1 MacBook Pro(上的VS code和clang++却无效?我已经在VS Code中将标准设置为c++20,并在命令行中使用clang++。

这是供参考的源代码。问题是main.cppstd::cout << yearMonthDay << std::endl;中的这条线

谢谢!

main.cpp

#include <vector>
#include "person.h"
int main()
{
Person p1;
p1.setBirthDay(std::chrono::day{4});
p1.setBirthMonth(std::chrono::month{12});
p1.setBirthYear(std::chrono::year{1996});
auto yearMonthDay = p1.getBirthdate();
std::cout << p1.getFullName() << std::endl;
std::cout << p1.getAge() << std::endl;
std::cout << yearMonthDay << std::endl;
p1.setAge(29);
p1.setfName("John");
p1.setlName("Conner");
std::cout << p1.getAge() << std::endl;
std::cout << p1.getFullName() << std::endl;
return 0;
}

个人.cpp

#include "person.h"
std::chrono::year_month_day Person::getBirthdate()
{
auto ymd{Person::birthYear / Person::birthMonth / Person::birthDay};
return ymd;
}
void Person::setBirthDay(std::chrono::day d)
{
Person::birthDay = d;
}
void Person::setBirthMonth(std::chrono::month m)
{
Person::birthMonth = m;
}
void Person::setBirthYear(std::chrono::year y)
{
Person::birthYear = y;
}
void Person::setfName(std::string fname)
{
Person::fName = fname;
}
void Person::setlName(std::string lname)
{
Person::lName = lname;
}
std::string Person::getFullName()
{
return Person::fName + " " + Person::lName;
}
void Person::setAge(int x)
{
Person::age = x;
}
int Person::getAge() const
{
return Person::age;
}

人.h

#include <string>
#include <iostream>
#include <chrono>
class Person
{
private:
int age;
std::string fName;
std::string lName;
std::chrono::day birthDay;
std::chrono::month birthMonth;
std::chrono::year birthYear;
public:
Person()
{
Person::fName = "NULL";
Person::lName = "NULL";
Person::age = 0;
Person::birthDay = {std::chrono::day(0)};
Person::birthMonth = {std::chrono::month(0)};
Person::birthYear = {std::chrono::year(0)};
}
~Person()
{
std::cout << "Deconstructed."
<< "n";
}
std::string getFullName();
std::chrono::year_month_day getBirthdate();
void setBirthDay(std::chrono::day d);
void setBirthMonth(std::chrono::month m);
void setBirthYear(std::chrono::year y);
void setfName(std::string fname);
void setlName(std::string lname);
void setAge(int x);
int getAge() const;
};

libc++(clang std::lib(还没有发布C++20的这一部分。然而,如果你想使用一个转换工具,有一个C++20这一部分的开源预览版。

对于您在本例中使用的零件,预览位于date.h中,它仅为标题。只需#include "date/date.h",并将编译器指向date/include。命名空间也不同。用date::代替std::chrono::来代替year_month_day。要让流媒体运营商发挥作用,您需要:

using date::operator<<;

以便在CCD_ 11中找到流式运营商。

相关内容

最新更新