используя язык c++: я создал структуру generic, и я хочу дать ей псевдоним, но не удалось! вот код:
template<class T>
struct noeud {
T val;
struct noeud *next;
};
typedef struct noeud * Noeud;
вот ошибка:
аргумент шаблона, необходимый для недопустимого типа 'struct noeud' в объявлении до ';' токен Сборка: 2 ошибки, 0 предупреждение (и)
вы можете добиться этого, используя синтаксис, введенный в версии С++ 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>>;
Если вы хотите иметь другой шаблон в качестве псевдонима, вы должны использовать ключевое слово using
:
template<typename T>
using AliasName = noeud<T>*;
template<typename T> using AliasName= noeud<T>* ;
является template<typename T> using AliasName= noeud<T>* ;
должен быть
typedef struct noeud<your type>* Noeud;
где ваш тип - это тип, который вы хотите, чтобы структура была инициирована с помощью
Чтобы добавить к другим ответам:
Класс 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>*