我想我的问题很直接,但如果我仍然不善于解释,请原谅我。基本上,我在学习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中找到流式运营商。