Создание псевдонима с помощью ключевого слова using для std::chrono вызывает ошибки компилятора

Я пытаюсь использовать псевдонимы для 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>>.

Может ли кто-нибудь помочь мне понять, почему выдает эту ошибку?

связанное/обман: stackoverflow.com/questions/1211399/what-is-a-namespace-alia‌​s

NathanOliver 05.09.2024 01:08
namespace co = std::chrono; Однако на занятиях это запрещено.
Igor Tandetnik 05.09.2024 01:09

@NathanOliver Понял, почему не работает «std::chrono». Но так и не понял, как это работает для std::chrono::time_point<std::chrono::system_clock>;, а не для std::chrono::duration_cast<std::chrono::seconds>;

kadina 05.09.2024 01:15
std::chrono::duration_cast — шаблон функции; вы не можете создать псевдоним функции. std::chrono::time_point — шаблон класса; вы можете создать псевдоним для типа. Другими словами: если у вас есть class C{}; void f();, вы можете написать using C_alias = C;, но не using f_alias = f;.
Igor Tandetnik 05.09.2024 01:16
std::chrono::time_point<std::chrono::system_clock> — это тип, и для типов можно создавать псевдонимы. std::chrono::duration_cast<std::chrono::seconds> — это функция. и вы не можете создавать псевдонимы для функций.
NathanOliver 05.09.2024 01:16

Но вы можете перенести функцию в текущее пространство nmaespace с помощью: using std::chrono::duration_cast;

Loki Astari 05.09.2024 02:17

Ключевая фраза из сообщения об ошибке: «не называет тип». Другими словами, ваш компилятор сообщил вам, что std::chrono не является типом и std::chrono::duration_cast<std::chrono::seconds> не является типом. Вы с этим не согласны? Если нет, то ваш компилятор уже ответил на ваш вопрос (он выдал ошибку, поскольку это не типы). Возможно, вместо этого вы захотите спросить, как создавать псевдонимы для вещей, которые не являются типами? (Однако это будет два вопроса: один по пространствам имен, другой по функциям.)

JaMiT 05.09.2024 02:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
7
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь есть 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>, следовательно, является конкретным типом.
    Допустимо создание псевдонима для типа, и поэтому эта строка действительна.

Другие вопросы по теме