我正在爲我的CS類獲取一堆字符串(String ADT,我自己做的),但是我被它的一部分所捕獲,並且無法弄清楚什麼是錯誤的。當我使用Makefile編譯代碼時,出現以下錯誤:test_default_ctor:./stack.hpp:53:T stack :: pop()[T = String]:聲明'TOS!= 0'失敗。C++ - >斷言失敗堆棧
由於我在頭文件中聲明的pop()函數導致我的測試未運行。這裏是我的代碼片段:
#ifndef STACK_HPP
#define STACK_HPP
#include <iostream>
#include <cassert>
#include <new>
#include "string/string.hpp"
template <typename T>
class node{
public:
node(): next(0), data(){};
node(const T& x): next(0), data(x){};
node<T> *next;
T data;
// EXAM QUESTION: This class is going to be used by another class so all needs to be accessable
// Including node p and node v.
};
template <typename T>
class stack{
public:
stack(): TOS(0){};
~stack();
stack(const stack<T>&);
void swap(stack<T>&);
stack<T>& operator=(stack<T> rhs){swap(rhs); return *this;};
bool operator==(const stack<T>&) const;
bool operator!=(const stack<T>& rhs) const {return !(*this == rhs);};
friend std::ostream& operator<<(std::ostream&, const stack<T>&);
bool isEmpty()const{return TOS == 0;};
bool isFull(void)const;
T pop(void);
void push(const T&);
int slength()const{String nuevo; return nuevo.length();};
private:
node<T> *TOS;
};
template <typename T>
T stack<T>::pop(){
assert(TOS!=0);
node<T> *temp=TOS;
T result=TOS -> data;
TOS=TOS -> next;
int len=slength();
--len;
delete temp;
return result;
}
template <typename T>
bool stack<T>::operator==(const stack<T>& rhs) const{
stack<T> left = *this;
stack<T> right = rhs;
if(slength() != rhs.slength())
return false;
if(left.pop() != right.pop())
return false;
else
return true;
}
,這裏是我的測試:
#include "stack.hpp"
#include "string/string.hpp"
#include <cassert>
int main()
{
{
stack<String> test;
assert(test == stack<String>());
assert(test.slength()==0);
}
std::cout<<"Done testing default constructor!"<<std::endl;
return 0;
}
我知道這是發生,因爲堆棧(TOS)的頂部是0,但我不知道爲什麼斷言不會讓它通過,儘管在我的測試中pop函數根本沒有被調用。誰能提供任何幫助?
我猜你沒有顯示所有的代碼和'pop'被稱爲某處。 –
在你說完之後退後一步,我覺得這可能是我的平等運營商的問題,所以我在那裏編輯了那個問題,我認爲這可能是問題所在。 – Cody
請參閱下面的答案。 –