2010-10-28 73 views
0

我正在尝试编写一些容器类来实现C++中的主数据结构。头文件是在这里:这是什么错误? (为什么它不会在其他类中发生?)

#ifndef LINKEDLIST1_H_ 
#define LINKEDLIST1_H_ 

#include <iostream> 
using namespace std; 

template<class T> class LinkedList1; 
template<class T> class Node; 

template<class T> 
class Node 
{ 
    friend class LinkedList1<T> ; 
public: 
    Node<T> (const T& value) 
    { 
     this->Data = value; 
     this->Next = NULL; 
    } 
    Node<T>() 
    { 
     this->Data = NULL; 
     this->Next = NULL; 
    } 
    T Data; 
    Node* Next; 
}; 

template<class T> 
class LinkedList1 
{ 
    friend class Node<T> ; 
public: 
    LinkedList1(); 
// LinkedList1<T>(); 
    ~LinkedList1(); 
    // Operations on LinkedList 
    Node<T>* First(); 

    int Size(); 
    int Count(); 
    bool IsEmpty(); 
    void Prepend(Node<T>* value); //O(1) 
    void Append(Node<T>* value); 
    void Append(const T& value); 
    void Insert(Node<T>* location, Node<T>* value); //O(n) 
    Node<T>* Pop(); 
    Node<T>* PopF(); 
    Node<T>* Remove(const Node<T>* location); 
    void Inverse(); 
    void OInsert(Node<T>* value); 
    // TODO Ordered insertion. implement this: foreach i,j in this; if i=vale: i+=vale, break; else if i<=value<=j: this.insert(j,value),break 
    void print(); 
private: 
    Node<T>* first; 
    int size; 
}; 

#endif /* LINKEDLIST1_H_ */ 

当我尝试在其他类中使用它,比如像这样:发生

void IDS::craete_list() 
{ 
    LinkedList1<int> lst1 = LinkedList1<int>::LinkedList1<int>(); 
} 

此错误:

undefined reference to 'LinkedList1<int>::LinkedList1<int>()' 

的构造类是公共的,它的头文件包含在内。我也试图包含这个类的.cpp文件,但是这没有帮助。我用完全相同的方式写了其他类如SparseMatrix和DynamicArray,并且没有错误!...

+0

有您所提供的模板的实际定义是什么?它们是从模板被调用的地方到达的吗? (还要注意,语法是错误的,变量定义的正确语法是:'LinkedList1 lst1;' - 没有赋值和对构造函数的显式调用不正确) – 2010-10-28 08:28:01

+1

一般而言,模板类*必须*整个东西)放入头文件中,因为需要* source *来创建不同的实例。 – 2010-10-28 08:28:16

+0

@大卫·罗德里格斯:是的。 – 2010-10-28 08:30:36

回答

0

创建对象,这样做:。

void IDS::craete_list() 
{ 
    LinkedList1<int> lst1; 
} 

至于连接问题,如果您在源(CPP)文件中定义的模板类,你需要包括它,而不是头文件。

+0

相同的错误发生。我包括他们两个,只有头和只有cpp。但在每种情况下都会再次出现相同的错误 – 2010-10-28 08:47:21

2

有许多说法可以(应该)在您的代码上进行。我还假设没有理由手动实现链接列表,而不是使用STL以外的其他功能,所以适当的标签会很好。

  • 不建议使用在using namespace包括文件
  • 没有理由class Node的向前声明,因为它紧跟
  • 没有必要使用Node<T>类里面,经常Node足够
  • 你不需要使用this->数据成员
  • 最好是&较短的使用构造函数初始化列表
  • 错误:使用this->Data = NULL;你含蓄地要求T是一个指针。让Data默认构造
  • 为什么Node将LinkedList1声明为朋友,我没有看到它在您提供的代码中的任何用法?

您的代码可能是这样的:

#ifndef LINKEDLIST1_H_ 
#define LINKEDLIST1_H_ 

template<class T> class LinkedList1; 

template<class T> 
class Node 
{ 
    friend class LinkedList1<T> ; 
public: 
    Node (const T& value): Data(value), Next(NULL) {} 
    Node(): Next(NULL) {} 
    T Data; 
    Node* Next; 
}; 
+0

是的,它的功课:)我会改变我的代码。但是你确定没有必要使用命名空间吗?当它从头文件中移除时,cout变得不确定。干杯。 – 2010-10-28 11:49:43

+1

@Sorush:是的,你需要完全符合'std :: cout'的标准。原因是,如果任何人使用你的代码(作为库)并包含你的文件,她就会“继承”你的这个命名空间。这当然只是一个良好实践的建议 - 在私有的.cpp文件中使用'namespace'而不是在includes中 – davka 2010-10-28 12:33:48

相关问题