首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

模版编译,该如何处理

2012-04-18 
模版编译C/C++ codeTree.h#ifndef TREE_H#define TREE_Htemplate typename Tclass Tree{template typen

模版编译

C/C++ code
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 ===|


[解决办法]
能不能看下main 函数啊 怎么类模板Tree的构造函数是私有的呢 那怎么生成Tree对象 又如何生成一个Tree指针 即使用 new ,new 表达式第二个步骤也是在申请的空间上构造对象啊~
[解决办法]
我这样改了之后在vs 2008下运行没有出错 不知道有没有什么问题

Tree.h
C/C++ code
#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里的。

热点排行