缺少别名模板C++参数列表

C++ argument list for alias template is missing

本文关键字:C++ 参数 列表 别名      更新时间:2023-10-16

我在"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++17 上下文中(,在使用别名模板时,您需要显式提供模板参数列表。

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

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

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

您可以通过从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) {
/* ... */
}