模版编译
Tree.h#ifndef TREE_H#define TREE_Htemplate <typename T>class Tree{ template <typename Type> friend class SearchTree; Tree(): left(0), right(0) {} T element; Tree* left; Tree* right;};template <typename T>class SearchTree{public: SearchTree(): tree(0) {} Tree<T>* Insert(const T& t, Tree<T>*); Tree<T>* Find(const T& t, Tree<T>*); Tree<T>* GetTree(); void Print(Tree<T>*);private: Tree<T> *tree;};#include "Tree.cpp"#endifTree.cpp#include <iostream>using std::cout;template <class T>Tree<T>* SearchTree<T>::Insert(const T& t, Tree<T>* Te){ if (tree == NULL) { int *t = new int; if (tree == NULL) cout << "out of space\n"; else { tree->left = tree->right = NULL; } } else if (t < tree->element) { tree->left = Insert(t, tree->left); } else if (t > tree->element) { tree->right = Insert(t, tree->right); } return tree;}template <class T>Tree<T>* SearchTree<T>::Find(const T& t, Tree<T>* Te){ if (tree == NULL) return NULL; if (t < tree->element) return Find(t, tree->left); else if (t > tree->element) return Find(t, tree->right); else return tree;}template <class T>void SearchTree<T>::Print(Tree<T>* Te){ if (tree != NULL) { Print(tree->left); cout << tree->element << "\t"; Print(tree->right); }}template <class T>Tree<T>* SearchTree<T>::GetTree(){ return tree;}编译器给的错误。Tree\Tree.cpp|5|error: expected constructor, destructor, or type conversion before '<' token|\Tree\Tree.cpp|30|error: expected constructor, destructor, or type conversion before '<' token|\Tree\Tree.cpp|43|error: expected initializer before '<' token|\Tree\Tree.cpp|54|error: expected constructor, destructor, or type conversion before '<' token|||=== Build finished: 4 errors, 0 warnings ===|
#ifndef TREE_H#define TREE_Htemplate <typename T>class Tree{ template <typename T,typename T2> friend class SearchTree; Tree(): left(0), right(0) {} T element; Tree* left; Tree* right;};template <typename T, typename T2 = Tree<T> >class SearchTree{public: SearchTree(): tree(0) {} T2* Insert(const T& t, T2*); T2* Find(const T& t, T2*); T2* GetTree(); void Print(T2*);private: T2 *tree;};#endif
[解决办法]
试一下更改Tree的友元类的模板形参 将T改成其他东西 试试吧
[解决办法]
楼主用 g++ 吗,把完整的编译命令行发一下。
[解决办法]
模板函数的声明与定义应该放在同一个头文件下
------解决方案--------------------
可以试下把template <typename Type> class SearchTree;这句放在class Tree 的定义之前,在vc 6.0 下可以编译通过
[解决办法]
1, 模板不能分离编译.
2, 抛开1不谈, 你的.cpp没有include .h.
3, 抛开1,2都不谈, 抛开模板不谈, 你应该将tree和searchtree分到不同的头文件与源文件中, 因为依赖关系永远是单向的, 这里是searchTree依赖tree, 那么tree类接口变化时searchTree关联的所有源文件需要重新编译, 这是必然的. 但是tree不依赖searchTree的接口, 意味着searchTree接口变化时tree关联的源文件统统不需要重新编译, 然而你将tree和searchTree放在一个.h和.cpp中, 将来SearchTree发生变化, Tree关联到的文件也要跟着编译, 毫无意义.
[解决办法]
把Tree.cpp的被容放到Tree.h中就可以编译通过了,要不然Tree.cpp自己被编译一次,包含到main.cpp里又编译了一次。。。
[解决办法]
模板是不能实现在cpp里的。