我是C ++的新手。 我开始使用类模板创建容器列表,但是如果我像这样在main中实例化类模板列表,则VS编译器给我一个错误: 清单l(5); 如果我在main()中删除此行,则代码将编译为OK。或者,如果我在类列表之外定义类Node,则不会出现此错误。编译器在此行代码处发出错误:
node_ptr head = (alloc.allocate(s));
请帮助。非常感谢你!
#include "pch.h"
#include <iostream>
#include <memory>
using namespace std;
template<class T> class Node; //forward declaration
template< class T, typename Allocator = std::allocator<Node<T>>>
class List
{
using data_ptr = T *;
using data_type = T;
class Node {
public:
T value;
Node* next;
Node() : value(data_type()), next(0) {}
};
using node = Node;
using node_ptr = Node*;
public:
List() : length(0), head(NULL), alloc(std::allocator<int>()) {}
explicit List(size_t s) : length(s), head(NULL), alloc(std::allocator<Node>())
{
node_ptr head = (alloc.allocate(s));
}
~List() {};
//private:
node_ptr head;
size_t length;
Allocator alloc;
};
int main()
{
List<int> l(5); //The compile error is gone if this line is removed
system("pause");
return 0;
}
答案 0 :(得分:0)
第一个Node
被定义为类模板:
template<class T> class Node; //forward declaration
而分配器默认是这样的:
std::allocator<Node<T>>
但是,稍后,Node被定义为List的内部类,而不是模板。 这就是编译器抱怨的原因:Node *!= Node *
一种解决方案是将分配器默认设置为std :: allocator,并使用rebind获得Node分配器:
using node_allocator = Allocator::template rebind_alloc<Node<T>>;
您的代码中还有其他错误/警告,例如:List ctor的init列表中的初始化顺序错误,或者您用局部变量head
遮蔽了类成员head
。