使用c ++语言:我使结构通用,我想给它一个别名,但失败了! 这是代码:
template<class T>
struct noeud {
T val;
struct noeud *next;
};
typedef struct noeud * Noeud;
这是错误:
'struct noeud'需要模板参数 ';'之前的声明中的无效类型代币 构建:2个错误,0个警告
答案 0 :(得分:3)
您可以使用C ++ 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 :(得分:1)
应该是
typedef struct noeud<your type>* Noeud;
您的类型是您希望结构与
实例化的类型答案 2 :(得分:1)
如果您想将其他模板作为别名,则必须使用using
关键字:
template<typename T>
using AliasName = noeud<T>*;
答案 3 :(得分:0)
要添加其他答案:
类noeud
是一个模板,因此它需要一个模板参数来成为一个类型,因为模板类型是在编译时推导出来的。 E.g:
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
放在类型前面。在C ++中,关键字struct
表示类,默认访问说明符设置为 public 。
正如其他人所提到的,在 C ++ 11 中,您可以使用using
语法来声明模板化别名(typedef
不< / em>允许模板化别名),例如:
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>*