c++ - 为什么我可以在 Windows 上编译和使用 std::cout << std::chrono::year_month_day 数据类型,但在 macOS 上的 VS Code 中我无法编译?
问题描述
我认为我的问题很简单,但如果我仍然无法解释,请原谅我。基本上我正在学习 C++ 并<chrono>
从 C++20 开始将日期值存储在一个简单的 Person 类中。问题是我的 M1 MacBook Pro 上的这个源代码使用标准设置为 C++20 的 VS 代码,它在 << 在 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 工作站上,此代码很好地满足了智能感知,成功编译和链接,并按预期输出了我设置的年月日。
为什么此代码适用于 Windows 的 Visual Studio 2019,但不适用于 macOS(M1 MacBook Pro)上的 VS Code 和 clang++?我在 VS Code 中将标准设置为 c++20,在命令行中设置为 clang++。
这是供参考的源代码。问题是 main.cpp 中的这一行std::cout << yearMonthDay << std::endl;
谢谢!
主文件
#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<<;
以便在namespace date
.
推荐阅读
- typescript - 以数组形式访问静态只读属性
- python - 无法弄清楚如何使用 Spyne 将 Python dict/Json 作为 xml 返回
- scala - 如何使用 Datastax 连接器从 Spark Dataframe 更新特定的 Cassandra 列集
- javascript - 三.js 示例
- ios - 解析 JSON Swift 4
- go - Go中的make函数如何处理可选参数?
- java - 如何修复 java.util.NoSuchElementException 错误
- javascript - 在 Highchart 中将目标添加到柱形图中
- angular - 是否可以在角度材料中同时使用 filter 和 filterPredicate ?
- android - 在 Android Studio 中构建 Telegram 源时出现 NDK 错误