Я пытаюсь использовать псевдонимы для 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>>
.
Может ли кто-нибудь помочь мне понять, почему выдает эту ошибку?
namespace co = std::chrono;
Однако на занятиях это запрещено.
@NathanOliver Понял, почему не работает «std::chrono». Но так и не понял, как это работает для std::chrono::time_point<std::chrono::system_clock>;
, а не для std::chrono::duration_cast<std::chrono::seconds>;
std::chrono::duration_cast
— шаблон функции; вы не можете создать псевдоним функции. std::chrono::time_point
— шаблон класса; вы можете создать псевдоним для типа. Другими словами: если у вас есть class C{}; void f();
, вы можете написать using C_alias = C;
, но не using f_alias = f;
.
std::chrono::time_point<std::chrono::system_clock>
— это тип, и для типов можно создавать псевдонимы. std::chrono::duration_cast<std::chrono::seconds>
— это функция. и вы не можете создавать псевдонимы для функций.
Но вы можете перенести функцию в текущее пространство nmaespace с помощью: using std::chrono::duration_cast;
Ключевая фраза из сообщения об ошибке: «не называет тип». Другими словами, ваш компилятор сообщил вам, что std::chrono
не является типом и std::chrono::duration_cast<std::chrono::seconds>
не является типом. Вы с этим не согласны? Если нет, то ваш компилятор уже ответил на ваш вопрос (он выдал ошибку, поскольку это не типы). Возможно, вместо этого вы захотите спросить, как создавать псевдонимы для вещей, которые не являются типами? (Однако это будет два вопроса: один по пространствам имен, другой по функциям.)
Здесь есть 3 разных случая (в основном сводка информации из комментариев):
using co = std::chrono;
:
std::chrono
— это пространство имен. Вы не можете создать псевдоним пространства имен в области класса. Также правильный синтаксис для псевдонима пространства имен (в глобальной области):
namespace co = std::chrono;
using coDurationCast = std::chrono::duration_cast<std::chrono::seconds>;
:
std::chrono::duration_cast — это шаблон функции. Вы не можете создать псевдоним для функции или шаблона функции.
Что вы можете сделать, так это перенести функцию в текущее пространство имен, используя:
using std::chrono::duration_cast;
using timeType = std::chrono::time_point<std::chrono::system_clock>;
:
std::chrono::time_point — это шаблон класса, и std::chrono::time_point<std::chrono::system_clock>
, следовательно, является конкретным типом.
Допустимо создание псевдонима для типа, и поэтому эта строка действительна.
связанное/обман: stackoverflow.com/questions/1211399/what-is-a-namespace-alias