【问题标题】:Invalid Conversion from 'int' to 'nodeType<int>'从“int”到“nodeType<int>”的无效转换
【发布时间】:2017-02-19 15:05:02
【问题描述】:

我正在尝试创建一个使用堆栈反转链表的程序;但是,我不断收到相同的错误,即我无法将节点设置为等于 int 但我已经看到了多个可能的示例!我可能做错了什么?

这里是代码。

#include<iostream>
#include<fstream>

using namespace std;


#include "linkedStack.h"
nodeType<int> *head = NULL;
void traversal(linkedStackType<int>);

int main(){

    linkedStackType<int> Estack;
    linkedStackType<int> Ostack;
    linkedStackType<int> Tstack;
    Estack.initializeStack();
    Ostack.initializeStack();
    int num; 

    for (int i = 0; i < 10; i++)
    {
    cout << "Hello! Enter a number.\n";
    cin >> num;
        if (num % 2 == 0)
        {
            cout << "This number is even! It's going to the even stack.\n";
            Estack.push(num);
        }
        else
        {
            cout << "This number is odd! It's going to the odd stack.\n";
            Ostack.push(num);
        }
    }
    traversal(Estack);
    traversal(Ostack);

    system("Pause");
    return 0;
}
void traversal(linkedStackType<int> stack)
{
    nodeType<int> *current = NULL, *first = NULL;
        current = first;
        while (current != NULL) {
        stack.push(current->info);
        current = current->link;
    }
    while (stack.isEmptyStack() != true){
        current=stack.top();
        stack.pop();
        cout << current->info << " ";
    }
}

linkedStack.h

#ifndef H_StackType
#define H_StackType

#include <iostream>
#include <cassert>
using namespace std;

#include "stackADT.h"

template <class Type>
struct nodeType
{
    Type info;
    nodeType<Type> *link;
};

template <class Type>
class linkedStackType :public stackADT<Type>
{
public:
    linkedStackType();

    //Default constructor
    //Postcondition: stackTop = NULL;

    Type top() const;

    //Function to return the top element of the stack.
    //Precondition: The stack exists and is not empty.
    //Postcondition: If the stack is empty, the program
    // terminates; otherwise, the top element of
    // the stack is returned.
    const linkedStackType<Type>& operator=
        (const linkedStackType<Type>&);
    //Overload the assignment operator.

    bool isEmptyStack() const;
    //Function to determine whether the stack is empty.
    //Postcondition: Returns true if the stack is empty;
    // otherwise returns false.

    bool isFullStack() const;

    //Function to determine whether the stack is full.
    //Postcondition: Returns false.

    void push(const Type& newItem);

    //Function to add newItem to the stack.
    //Precondition: The stack exists and is not full.
    //Postcondition: The stack is changed and newItem is
    // added to the top of the stack.

    void initializeStack();

    //Function to initialize the stack to an empty state.
    //Postcondition: The stack elements are removed;
    // stackTop = NULL;
    void pop();

    //Function to remove the top element of the stack.
    //Precondition: The stack exists and is not empty.
    //Postcondition: The stack is changed and the top
    // element is removed from the stack.

    linkedStackType(const linkedStackType<Type>& otherStack);
    //Copy constructor
    //~linkedStackType();

    //Destructor
    //Postcondition: All the elements of the stack are removed
private:

    nodeType<Type> *stackTop; //pointer to the stack

    void copyStack(const linkedStackType<Type>& otherStack);
    //Function to make a copy of otherStack.
    //Postcondition: A copy of otherStack is created and
    // assigned to this stack.
};


template <class Type>
linkedStackType<Type>::linkedStackType()
{
    stackTop = NULL;
}

template <class Type>
bool linkedStackType<Type>::isEmptyStack() const

{
    return(stackTop == NULL);
} //end isEmptyStack

template <class Type>
bool linkedStackType<Type>::isFullStack() const
{
    return false;
} //end isFullStack
template <class Type>

void linkedStackType<Type>::initializeStack()

{

    nodeType<Type> *temp; //pointer to delete the node
    while (stackTop != NULL) //while there are elements in
                             //the stack
    {
        temp = stackTop; //set temp to point to the
                         //current node
        stackTop = stackTop->link; //advance stackTop to the
                                   //next node
        delete temp; //deallocate memory occupied by temp
    }
} //end initializeStack

template <class Type>
void linkedStackType<Type>::push(const Type& newElement)
{
    nodeType<Type> *newNode; //pointer to create the new node
    newNode = new nodeType<Type>; //create the node
    newNode->info = newElement; //store newElement in the node
    newNode->link = stackTop; //insert newNode before stackTop
    stackTop = newNode; //set stackTop to point to the
                    //top node
} //end push
template <class Type>
void linkedStackType<Type>::pop()

{
    nodeType<Type> *temp; //pointer to deallocate memory
    if (stackTop != NULL)

    {
        temp = stackTop; //set temp to point to the top node
        stackTop = stackTop->link; //advance stackTop to the
                                   //next node
        delete temp; //delete the top node
    }
    else
        cout << "Cannot remove from an empty stack." << endl;
}//end pop

template <class Type>
Type linkedStackType<Type>::top() const
{
    assert(stackTop != NULL); //if stack is empty,
                              //terminate the program
    return stackTop->info; //return the top element
}//end top

template <class Type>
void linkedStackType<Type>::copyStack(const linkedStackType<Type>& otherStack)
{
    nodeType<Type> *newNode, *current, *last;
    if (stackTop != NULL) //if stack is nonempty, make it empty
        initializeStack();
    if (otherStack.stackTop == NULL)
        stackTop = NULL;
    else
    {
        current = otherStack.stackTop; //set current to point
                                       //to the stack to be copied
                                       //copy the stackTop element of the stack
        stackTop = new nodeType<Type>; //create the node
        stackTop->info = current->info; //copy the info
        stackTop->link = NULL; //set the link field to NULL
        last = stackTop; //set last to point to the node
        current = current->link; //set current to point to the
                                 //next node
            //copy the remaining stack

            while (current != NULL)

            {
                newNode = new nodeType<Type>;
                newNode->info = current->info;
                newNode->link = NULL;
                last->link = newNode;
                last = newNode;
                current = current->link;
            }//end while
    }//end else
} //end copyStack

template <class Type>
const linkedStackType<Type>& linkedStackType<Type>::operator=(const linkedStackType<Type>& otherStack)
{
    if (this != &otherStack) //avoid self-copy
        copyStack(otherStack);
    return *this;
}//end operator=
template <class Type>

linkedStackType<Type>::linkedStackType(const linkedStackType<Type>& otherStack)
{
    stackTop = NULL;
    copyStack(otherStack);
}//end copy constructor



#endif

stackADT.h

template <class Type>
class stackADT

{
public:

    virtual void initializeStack() = 0;

    //Method to initialize the stack to an empty state.

    //Postcondition: Stack is empty.

    virtual bool isEmptyStack() const = 0;

    //Function to determine whether the stack is empty.

    //Postcondition: Returns true if the stack is empty,

    // otherwise returns false.

    virtual bool isFullStack() const = 0;

    //Function to determine whether the stack is full.

    //Postcondition: Returns true if the stack is full,

    // otherwise returns false.

    virtual void push(const Type& newItem) = 0;

    //Function to add newItem to the stack.

    //Precondition: The stack exists and is not full.

    //Postcondition: The stack is changed and newItem is added

    // to the top of the stack.

    virtual Type top() const = 0;

    //Function to return the top element of the stack.

    //Precondition: The stack exists and is not empty.

    //Postcondition: If the stack is empty, the program

    // terminates; otherwise, the top element of the stack

    // is returned.

    virtual void pop() = 0;

    //Function to remove the top element of the stack.

    //Precondition: The stack exists and is not empty.

    //Postcondition: The stack is changed and the top element

    // is removed from the stack.

};

Visual Studio 上的确切错误:

“int”类型的值不能分配给“nodeType *”类型的实体

任何建议将不胜感激。

【问题讨论】:

  • Type top() const 返回Type(在您的情况下为int)。而current=stack.top(); 其中currentnodeType&lt;int&gt;*current 不是int,它是指向nodeType&lt;int&gt; 的指针。所以...错误。有什么不清楚的地方?
  • 离题:在void traversal(linkedStackType&lt;int&gt; stack) 中,linkedStackType&lt;int&gt; stack 作为局部变量比作为参数更有意义。
  • “使用堆栈反转链表”与“将堆栈实现为链表并反向打印”不同。你真正想做的是哪一个?
  • 如有任何不一致之处,敬请原谅;这是我的第一个问题。我想将堆栈实现为链表并反向打印,以便输出以 FIFO 格式输出。

标签: c++ visual-studio linked-list stack dev-c++


【解决方案1】:

首先,您应该将"linkedStack.h""stackADT.h" 中的Type top() const; 更改为nodeType&lt;Type&gt;* top() const;。您应该在“stackADT.h”中添加template &lt;class Type&gt;struct nodeType;,因为linkedStackType 派生自stackADT。另外, Type top() const 应修改如下:

template <class Type>
nodeType<Type>* linkedStackType<Type>::top() const
{
    assert(stackTop != NULL); //if stack is empty,
                              //terminate the program
    return stackTop; //return the top element
}//end top

这样,我就编译成功了。

但是,函数void traversal(linkedStackType&lt;int&gt; stack) 存在一些算法问题。 currentfirst 都是 NULL 指针。那么当你 use current -&gt; info 时,current 指向什么?我觉得你应该修改这个函数void traversal(linkedStackType&lt;int&gt; stack)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多