Не удалось вывести аргумент шаблона для "Node<T> *" из "int"

В настоящее время я пытаюсь реализовать связанный список 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;
        }
    }
};

основной.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'

🤔 А знаете ли вы, что...
C++ обладает множеством инструментов для отладки и профилирования кода.


1
94
2

Ответы:

Решено

Компилятор не может вывести тип аргумента, потому что 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: логика вашего конструктора кажется ошибочной, что, вероятно, приводит к ошибке сегментации. Подробнее читайте в Википедии или в C-реализации это (с объяснением).


Просто укажите явно аргумент шаблона функции, например

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

или

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