LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 564|回复: 3

问: C++模板的定义和使用是否必须在同一个文件中?

[复制链接]
发表于 2005-2-18 18:27:20 | 显示全部楼层 |阅读模式
C++模板的定义和使用是否必须在同一个文件中?

我的程序如下:

$ cat sorttest.h
#ifndef SORTTEST_H_
#define SORTTEST_H_
template<class T>
void Swap(T& a,T& b);

template<class T>
void Bubble(T a[],int n);

template<class T>
void BubbleSort(T a[],int n);

#endif


$ cat sorttest.cpp
#include "sorttest.h"
#include <iostream>
using namespace std;

int main()
{
        int a[]={13,12,14,11};
        BubbleSort(a,4);
        for(int i=0;i<4;i++)
                cout<<"a["<<i<<"]="<<a<<endl;
        return 0;
}

$ cat Swap.cpp
template<class T>
void Swap(T& a,T& b)
{
        T c;
        c=a;
        a=b;
        b=c;
}


$ cat BubbleSort.cpp
#include "sorttest.h"
#include <iostream>
using namespace std;

template<class T>
void Bubble(T a[],int n)
{
        for(int i=0;i<n-1;i++)
                if(a>a[i+1])
                        Swap(a,a[i+1]);
}

template<class T>
void BubbleSort(T a[],int n)
{
        for(int i=n;i>1;i--)
                Bubble(a,i);
}


$ cat Makefile
OBJ=BubbleSort.o Swap.o sorttest.o
sorttest(OBJ)
        g++ -o sorttest $(OBJ)
Swap.o:Swap.cpp
        g++ -c Swap.cpp
BubbleSort.o:BubbleSort.cpp
        g++ -c BubbleSort.cpp
sorttest.o:sorttest.cpp sorttest.h
        g++ -c sorttest.cpp

编译的结果,出错!
g++ -c BubbleSort.cpp
g++ -o sorttest BubbleSort.o Swap.o sorttest.o
sorttest.o(.text+0x3b): In function `main':
: undefined reference to `void BubbleSort<int>(int*, int)'
collect2: ld returned 1 exit status

请各位高手帮我分析一下,这个错误是什么意思?

是Makefile有错误还是template跟实现部分只能在同一个文件中?
发表于 2005-2-18 18:45:27 | 显示全部楼层
对 世界上只有一个c++编译器实现了 模板分离编译模式 就是支持export关键字

gcc,lcc和vc都没有  详细解释请google
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-19 12:29:23 | 显示全部楼层
这样限制了template的使用。遗憾!
回复 支持 反对

使用道具 举报

发表于 2005-3-21 11:16:58 | 显示全部楼层
模板函数 声明和定义是写在一起的,你那样写是乱写

定义好之后,使用的时候 可以不在同一个文件中
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表