编译器错误C2955

时间:2016-09-04 18:30:51

标签: c++

我正在研究指针和模板,并尝试使用模板创建双链表。编译器将C2955抛出15行。

#include "stdafx.h"
#include <iostream>

using namespace std;

template<typename T>
struct s_node
{
    T value;
    s_node *p_next;
    s_node *p_prev;
};

template<typename T>
s_node* createNode(s_node *p_parent = NULL) {

    s_node *p_newNode = new s_node;

    p_newNode->value = 0;
    p_newNode->p_next = NULL;

    if (p_parent != NULL) {
        p_parent->p_next = p_newNode;
    }

    return p_newNode;
}

2 个答案:

答案 0 :(得分:1)

错误非常明显:

error C2955: 's_node': use of class template requires template argument list

s_node是一个类模板。

更改代码如下:

template<typename T>
s_node<T>* createNode(s_node<T> *p_parent = NULL) {

  s_node<T> *p_newNode = new s_node<T>();

  p_newNode->value = 0;
  p_newNode->p_next = NULL;

  if (p_parent != NULL) {
    p_parent->p_next = p_newNode;
  }

  return p_newNode;
}

答案 1 :(得分:0)

  

错误C2955:&#39; s_node&#39;:使用类模板需要模板   参数列表

上述错误对于问题非常明显。

使用s_node *p_newNode = new s_node;是错误的。你应该这样做:

s_node<T> *p_newNode = new s_node<T>;

您需要模板化类的模板参数。另外,类返回类型必须是:

s_node<T>* createNode(s_node *p_parent = NULL) {
//....
}

旁注:作为推荐,使用nullptr代替NULL,它更现代。