C ++ определяет псевдоним для структуры, используя шаблон

0

используя язык c++: я создал структуру generic, и я хочу дать ей псевдоним, но не удалось! вот код:

template<class T>
struct noeud {
    T val;
    struct noeud *next;

};
typedef struct noeud * Noeud;

вот ошибка:

аргумент шаблона, необходимый для недопустимого типа 'struct noeud' в объявлении до ';' токен Сборка: 2 ошибки, 0 предупреждение (и)

  • 0
    Это шаблон, а не тип. Вы не можете определить тип псевдонима для чего - то , который еще не типа.
  • 0
    Вам не нужно ключевое слово struct или typedef в C ++ для того, что вы делаете.
Показать ещё 2 комментария
Теги:
struct
templates

4 ответа

3

вы можете добиться этого, используя синтаксис, введенный в версии С++ 11:

template<class T>
struct Node;

template <class T>
using NodePtr = Node<T>*;

Вы должны держаться подальше от голого указателя и вместо этого использовать умный указатель, например unique_ptr:

template <class T>
using NodePtr = std::unique_ptr<Node<T>>;
1

Если вы хотите иметь другой шаблон в качестве псевдонима, вы должны использовать ключевое слово using:

template<typename T>
using AliasName = noeud<T>*;
  • 0
    спасибо за ответ, но можно ли это сделать так: typedef struct noeud <T> * Noeud; я хочу, чтобы этот псевдоним был универсальным в конце, я сделаю так для нового типа (пример: int): Noeud <int> my_variable;
  • 2
    C ++ 11 обязателен, а синтаксис неверен. Хорошим template<typename T> using AliasName= noeud<T>* ; является template<typename T> using AliasName= noeud<T>* ;
1

должен быть

typedef struct noeud<your type>* Noeud;

где ваш тип - это тип, который вы хотите, чтобы структура была инициирована с помощью

  • 0
    спасибо за ответ, но можно ли это сделать так: typedef struct noeud <T> * Noeud; я хочу, чтобы этот псевдоним был универсальным в конце, я сделаю так для нового типа (пример: int): Noeud <int> my_variable;
  • 0
    проверьте второй ответ
Показать ещё 1 комментарий
0

Чтобы добавить к другим ответам:

  • Класс noeud является шаблоном и, следовательно, ему нужен параметр шаблона, чтобы стать типом, поскольку типы шаблонов выводятся во время компиляции. Например:

    template<class T>
    struct noeud {
        T val;
        //noeud* next          // Error: compiler doesn't know what a noeud is.
        noeud<T>* next;        // Need to specify template parameter (T can be used).
    };
    
    typedef noeud<int>* Noeud; // Need to specify template parameter.
    

    Также в C++ вам не нужно класть ключевое слово struct перед типом при объявлении классов "structs"/aggregate, когда нет двусмысленности. В C++ ключевое слово struct означает класс со спецификатором доступа по умолчанию, установленным для публики.

  • Как упоминалось другими, в C++ 11 вы можете использовать синтаксис using чтобы объявить шаблонный псевдоним (typedef не позволяет шаблонные псевдонимы), например:

    template<typename T>
    using noeud<T>* Noeud; // Use 'using' to create an alias in same manner as typedef.
    

    Это позволяет использовать псевдоним как:

    Noeud<int> n; // Type is: noeud<int>*
    

Ещё вопросы

Сообщество Overcoder
Наверх
Меню