我目前正在创建一个循环的双向链表作为练习。这项运动模仿了该死的东西,这被证明是一种非常痛苦的事情。经过多次,多次,多次错误删除后,我得到了更多的错误。我笑了,但现在我已经筋疲力尽了。
Node.h
template<class T>
class Node
{
public:
Node(T val) : data(val), next(0), prev(0) {}
Node(T val, Node *next, Node *prev) : data(val), next(next), prev(prev) {}
Node() : data(0), next(0), prev(0) {}
~Node()
{}
Node *next;
Node *prev;
T data;
};
LinkedList.h // Superclass
#ifndef _LINKEDLIST_H_
#define _LINKEDLIST_H_
#include "Node.h"
enum Direction
{
Forward,
Backward
};
template<class T>
class LinkedList
{
public:
virtual void push_back(T data) = 0;
virtual void push_front(T data) = 0;
virtual void pop_back() = 0;
virtual void pop_front() = 0;
virtual void insert_before(T data, int index) = 0;
virtual void insert_after(T data, int index) = 0;
virtual void pop_before() = 0;
virtual void pop_after() = 0;
virtual void display(Direction direction = Forward) = 0;
virtual int length() const = 0;
virtual T operator[](int index) = 0;
virtual Node<T> *operator()(T data) = 0;
};
#endif
CDLinkedList.h // Circular Doubly-Linked List
template<class T>
class CDLinkedList : public LinkedList<T>
{
public:
/* Functions go here */
Node<T> *operator()(T data)
{
Node<T> *temp = head;
for( int i(0);
i < length()-1 && temp->data != data;
++i, temp = temp->next )
continue;
if( temp->data == data )
return temp;
else
{
std::cerr << "Error: Element not found." << std::endl;
return 0;
}
}
void display(Direction direction = Forward)
{
std::ostream_iterator<T> oIter(std::cout, " ");
if( direction == Forward )
{
Node<T> *temp = head;
for( int i(0); i < length(); ++i, temp = temp->next )
oIter = temp->data;
}
else
{
Node<T> *temp = tail;
for( int i(0); i < length(); ++i, temp = temp->prev )
oIter = temp->data;
}
}
#include <iostream>
#include <vector>
int main( int argc, char** argv )
{
using std::cout;
using std::endl;
using std::cin;
using std::string;
CDLinkedList<std::string> list;
list.push_back("Hello");
list.push_back(",");
list.push_back("World.");
cout << "Displaying normally..." << endl;
list.display();
cout << "Displaying backwards..." << endl;
list.display(::Direction::Backward);
cin.get();
return 0;
}
模板使用int作为输入,但不使用字符串,这正是我目前正在努力工作的。
最后一个函数Node *operator()(T data)
是我当前遇到问题的孩子。我得到的错误是:
error C2784: 'bool std::operator !=(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : could not deduce template argument for 'const std::vector<_Ty,_Alloc> &' from 'std::string'
这里有什么问题?
答案 0 :(得分:4)
您缺少std::string
的比较运算符。尝试添加
#include <string>
保存main
的源文件中的。
包含<iostream>
会向您提供std::string
的前瞻性声明。那是因为<iostream>
允许你做很多字符串操作(例如,它允许你通过使用字符串流将字符串从/转换为几乎任何东西)。但是这个前向声明并没有给你任何比较运算符。您需要包含<string>
。
对于它的价值,你可以将你的测试用例最小化到
#include <iostream>
bool f() {
std::string a, b;
return a != b;
}
来证明这个问题。该测试用例由于完全相同的原因而无法编译,包括<string>
使其有效。
答案 1 :(得分:3)
我将在黑暗中进行狂刺。
我认为你应该#include <string>
而不是<vector>
。您可能有一个字符串的前向声明,但没有<string>
我认为您没有看到正确的operator==
和operator!=
重载。