初始化:无法从'_Ty *'转换为List <int,std :: allocator <Node <T >>>:Node *

时间:2019-09-20 20:48:24

标签: c++ class templates

我是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;  
    }  

1 个答案:

答案 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