首页 > 解决方案 > 缺少别名模板的 C++ 参数列表

问题描述

我在“ListNode.h”中使用“别名模板”,代码如下:

注:我使用的IDE是visual studio 2019

//ListNode.h
#ifndef DSACPP_LIST_LISTNODE_H_
#define DSACPP_LIST_LISTNODE_H_

typedef int Rank;

template<class T>
class ListNode
{
private:
    T data_;
    ListNodePosi pred_; ListNodePosi succ_;

public:
    ListNode() {}; 
    ListNode(T e, ListNodePosi pred = NULL, ListNodePosi succ = NULL)
        : data_{ e }, pred_{ p }, succ_{ succ } {}


    ListNodePosi insertAspred(T const& e); 
};

// alias template
template<typename T>
using  ListNodePosi = ListNode<T>*;

template<class T>
ListNodePosi ListNode<T>::insertAspred(T const& e) 
/*
-⭐ there will be a error: argument list for alias template "ListNodePosi" is missing
*/
{
    ...
}

#endif

我不知道如何解决这个错误。所以我在这里寻求你的帮助。非常感谢您的回答。

标签: c++templates

解决方案


与类模板非常相似(在非推导的 C++17 上下文中),您需要在使用别名模板时显式提供模板参数列表。

ListNodePosi<single-type-template-argument> ...;

但是,您的程序包含其他几个错误:

  • ListNode类模板的声明和定义中,名字 ListNodePosi还不知道,但是被使用了,
  • ListNodector(带参数的重载)在其成员初始化列表中进行p初始化时pred_引用:这应该引用pred.
  • 更喜欢使用nullptrover NULL(您实际上需要包含一些<c...>标题才能访问NULL,而nullptr指针文字本身就是作为关键字)。

您可以通过从前向声明 to 开始修复上面的第一个项目符号ListNode,然后是别名模板的声明ListNodePosi(因为它不需要ListNode完整),最后ListNode是使用别名模板的定义。

例如:

template <typename T> class ListNode;
template <typename T> using ListNodePosi = ListNode<T> *;

template <class T> class ListNode {
private:
  T data_;
  ListNodePosi<T> pred_;
  ListNodePosi<T> succ_;

public:
  ListNode(){};
  ListNode(T e, ListNodePosi<T> pred = nullptr, ListNodePosi<T> succ = nullptr)
      : data_{e}, pred_{pred}, succ_{succ} {}

  ListNodePosi<T> insertAspred(T const &e);
};

template <typename T> ListNodePosi<T> ListNode<T>::insertAspred(T const &e) {
  /* ... */
}

推荐阅读