C ++使用模板为结构定义别名

时间:2014-02-03 13:03:00

标签: c++ templates struct

使用c ++语言:我使结构通用,我想给它一个别名,但失败了! 这是代码:

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

};
typedef struct noeud * Noeud;

这是错误:

'struct noeud'需要

模板参数 ';'之前的声明中的无效类型代币 构建:2个错误,0个警告

4 个答案:

答案 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>*