Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用模板参数传递链接列表的节点类型和数据类型_C++_Templates - Fatal编程技术网

C++ 使用模板参数传递链接列表的节点类型和数据类型

C++ 使用模板参数传递链接列表的节点类型和数据类型,c++,templates,C++,Templates,在我的链表类中,我想将要存储的数据的数据类型以及包含数据的节点类型作为模板参数传递,但我一直得到编译错误。 这是节点类 利斯特 这是linkedlist类。 利斯特 当我试图从main实例化它时,我会得到编译器错误 int main() { std::cout << "Hello World!\n"; LinkedList<int, Node<int> > list; list.getHead(); } 以下是错

在我的链表类中,我想将要存储的数据的数据类型以及包含数据的节点类型作为模板参数传递,但我一直得到编译错误。 这是节点类 利斯特

这是linkedlist类。 利斯特

当我试图从main实例化它时,我会得到编译器错误

int main()
{
    std::cout << "Hello World!\n";
    LinkedList<int, Node<int> > list;
    list.getHead();

}
以下是错误:

1>X:\code1\Blib\Blib\llist.h(16,23): error C2143: syntax error: missing ';' before '<'
1>C:\code\Blib\Blib\llist.h(21): message : see reference to class template instantiation 'LinkedList<itemType,nodeType>' being compiled
1>C:\code\Blib\Blib\llist.h(16,1): error C2059: syntax error: '<'
1>C:\code\Blib\Blib\llist.h(16,1): error C2238: unexpected token(s) preceding ';'
1>Done building project "Blib.vcxproj" -- FAILED.
如果您想像nodeType一样使用nodeType作为模板,可以将其声明为

然后像这样使用它

LinkedList<int, Node> list;
如果你想像现在一样声明它,那么就用它作为

template <class itemType, class nodeType>
class LinkedList
{
    using node = nodeType;
    ...
};
如果您想像nodeType一样使用nodeType作为模板,可以将其声明为

然后像这样使用它

LinkedList<int, Node> list;
如果你想像现在一样声明它,那么就用它作为

template <class itemType, class nodeType>
class LinkedList
{
    using node = nodeType;
    ...
};

如果您有不同的节点类型,并且其中一些节点具有附加的模板参数,则模板参数方法会出现问题。您还可以采用另一种方法从节点提取itemType类型,而不是显式地将其传递给LinkedList。这可以通过将decltype应用于节点的成员函数来完成:


现在,您可以编写LinkedList并获得等于int的itemType。

如果您有不同的节点类型,并且其中一些节点具有额外的模板参数,那么模板模板参数方法就会出现问题。您还可以采用另一种方法从节点提取itemType类型,而不是显式地将其传递给LinkedList。这可以通过将decltype应用于节点的成员函数来完成:


现在可以编写LinkedList并获得等于int的itemType。

thx,但对于这一行,我仍然得到错误。使用node=nodeType;1> 模板参数“nodeType”的参数列表为missing@bsobaid我在答案中添加了活样本以供参考。thx@songyuanyao。这起作用了。因此,在这两种方法中,我们不必为类似节点的节点显式指定模板参数。它从以前的模板参数int推导出它的参数。LinkedList@bsobaid对于第二种方法,需要为类似节点的节点指定模板参数。另一方面,您可以使用不同的类型(如LinkedList)进行指定。哪一个更好取决于您的意图。thx,但对于这一行,我仍然得到错误。使用node=nodeType;1> 模板参数“nodeType”的参数列表为missing@bsobaid我在答案中添加了活样本以供参考。thx@songyuanyao。这起作用了。因此,在这两种方法中,我们不必为类似节点的节点显式指定模板参数。它从以前的模板参数int推导出它的参数。LinkedList@bsobaid对于第二种方法,需要为类似节点的节点指定模板参数。另一方面,您可以使用不同的类型(如LinkedList)进行指定。哪一种更好取决于您的意图。这也是一种非常可扩展且有用的方法。有些解释可能是错误的helpful@bsobaid,什么样的解释?嵌套decltype。使用itemType=std::decation\u t;但我查过了。这也是一种非常可扩展和有用的方法。有些解释可能是错误的helpful@bsobaid,什么样的解释?嵌套decltype。使用itemType=std::decation\u t;但我查过了。
template <class itemType, class nodeType>
class LinkedList
{
    using node = nodeType;
    ...
};
template<class nodeType>
class LinkedList {
    using itemType = std::decay_t<decltype(std::declval<nodeType>().getItem())>;
    // ...
};
template<class itemType>
class Node {
public:
    using type = itemType;
};

template<class nodeType>
class LinkedList {
    using itemType = typename nodeType::type;
    // ...
};