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?
7
There are 3 different cases here (mostly summary of the info from the comments):
-
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:<code>namespace co = std::chrono;</code><code>namespace co = std::chrono; </code>namespace co = std::chrono;
-
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:<code>using std::chrono::duration_cast;</code><code>using std::chrono::duration_cast; </code>using std::chrono::duration_cast;
-
using timeType = std::chrono::time_point<std::chrono::system_clock>;
:std::chrono::time_point
is a class template, andstd::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.