首页 > 解决方案 > 为什么我可以在 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;
};

标签: c++macosvisual-studiovisual-studio-codec++20

解决方案


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.


推荐阅读