无法从 'int' 中推断出 'Node<T> *' 的模板参数

Could not deduce template argument for 'Node<T> *' from 'int'

我目前正在尝试用 C++ 实现 XOR 链表。我尝试使用模板使其通用。这个错误在编译时弹出,我无法解决这个问题。

我尝试使用模板在谷歌上搜索 XOR 链表,但到目前为止似乎还没有实现它。

XORlinkedlist.h:

#pragma once
#include<iostream>

template <typename T>
struct Node
{
    T data;
    Node *XORcode;
};

template <typename T>
Node<T> * XOR(struct Node<T> *x, struct Node<T> *y)
{
    return (Node<T>*)( (uintptr_t)(x) ^ (uintptr_t)(y) );
}

template <typename T>
class XORlinkedList
{
private:
    Node<T> *top, *last;
public:
    XORlinkedList()
    {
        top = last = NULL;
    }

    void addAtBegin(T data)
    {
        Node<T> *temp = new Node<T>;
        temp->data = data;

        temp->XORcode = XOR(top, NULL);    //*****ERROR SHOWN IN THIS LINE HERE*****
        if(top != NULL)
            top->XORcode = XOR(top->XORcode, temp);
        top = temp;
    }

    ~XORlinkedList()
    {
        Node<T> *temp, *storeCode;
        temp = top;
        storeCode = NULL;

        while(top != NULL)
        {
            temp = top;
            top = XOR(top->XORcode, storeCode);
            std::cout<<temp->data<<" deleted\n";
            storeCode = temp->XORcode;
            delete temp;
        }
    }
};

main.cpp:

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

int main()
{
    XORlinkedList<int> X;

    X.addAtBegin(3);
    X.addAtBegin(4);
    X.addAtBegin(5);

    std::cin.get();
    return 0;
}

错误是:

error C2784: 'Node *XOR(Node *,Node *)' : could not deduce template argument for 'Node *' from 'int'

编译器无法推断参数类型,因为 NULL 不是指针类型。你应该重载你的方法,像这样,通过使用 nullptr,它是类型 std::nullptr_t:

的对象的对象
// nullptr overload. 
template <typename T>
Node<T> * XOR(struct Node<T> *x, std::nullptr_t)
{
  return x; // X⊕0 = X
}   

template <typename T>
Node<T> * XOR(struct Node<T> *x, struct Node<T> *y)
{
    return (Node<T>*)( (uintptr_t)(x) ^ (uintptr_t)(y) );
}

然后,像这样调用方法:

temp->XORcode = XOR(top, nullptr);

PS:您的构造函数的逻辑似乎有缺陷,可能导致分段错误。在维基百科或 this C 实现中阅读更多内容(附有解释)。

只需明确指定一个函数模板参数,例如

temp->XORcode = XOR<T>( top, NULL );

temp->XORcode = XOR<T>( top, nullptr );