Search code examples
c++c++11c++17c++-chrono

Creating alias by 'using' keyword for std::chrono is throwing compiler errors


I am trying to use alias for std::chrono and std::chrono::duration_cast<std::chrono::seconds> which are throwing compilation errors. I included <chrono> header file. Below is the code:

#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:

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

I am unable to understand why it is throwing this error. Surprisingly, the alias is working for std::chrono::time_point<<std::chrono::system_clock>>.

Can anyone please help me to understand why it is throwing this error?


Solution

  • There are 3 different cases here (mostly summary of the info from the comments):

    1. using co = std::chrono;:

      std::chrono is a namespace. You cannot create a namespace alias in class scope. Also the proper syntax for a namespace alias (at global scope) is:

      namespace co = std::chrono;
      
    2. using coDurationCast = std::chrono::duration_cast<std::chrono::seconds>;:

      std::chrono::duration_cast is a function template. You cannot create an alias for a function or a function template.
      What you can do is bring the function into the current namespace by using:

      using std::chrono::duration_cast;
      
    3. using timeType = std::chrono::time_point<std::chrono::system_clock>;:

      std::chrono::time_point is a class template, and std::chrono::time_point<std::chrono::system_clock> is therefore a concrete type.
      It is valid to create an alias to a type, and therefore this line is valid.