通过“using”关键字为 std::chrono 创建别名会引发编译器错误

问题描述 投票:0回答:1

我正在尝试使用

std::chrono
std::chrono::duration_cast<std::chrono::seconds>
的别名,这会引发编译错误。我包含了
<chrono>
头文件。下面是代码:

#include <chrono>
    
class abc {
    public:
        using co = std::chrono;  // Throwing compilation error
        using coDurationCast = std::chrono::duration_cast<std::chrono::seconds>; // Throwing compilation error
        using timeType = std::chrono::time_point<std::chrono::system_clock>; // Surprisingly this is working fine
};

错误:

error: ‘chrono’ in namespace ‘std’ does not name a type
error: ‘std::chrono::duration_cast’ in namespace ‘std::chrono’ does not name a template type

我无法理解为什么它会抛出这个错误。令人惊讶的是,该别名适用于

std::chrono::time_point<<std::chrono::system_clock>>

任何人都可以帮我理解为什么会抛出此错误吗?

c++ c++11 c++17 c++-chrono
1个回答
0
投票

这里有3种不同的情况(来自评论的信息摘要):

  1. using co = std::chrono;

    std::chrono
    是一个 命名空间。您无法在类范围内创建名称空间别名。此外,命名空间别名(在全局范围内)的正确语法是:
    namespace co = std::chrono;
    
  2. using coDurationCast = std::chrono::duration_cast<std::chrono::seconds>;
    std::chrono::duration_cast
    是一个函数模板。您无法为函数或函数模板创建别名。
    您可以使用以下命令将函数引入当前命名空间:
    using std::chrono::duration_cast;
    
  3. using timeType = std::chrono::time_point<std::chrono::system_clock>;

    std::chrono::time_point
    是一个模板类,因此
    std::chrono::time_point<std::chrono::system_clock>
    是一个 具体类型
    创建类型的别名是有效的,因此这一行是有效的。
© www.soinside.com 2019 - 2024. All rights reserved.