关于函数模板

jensenlv 2004-12-24 08:50:04
1.文件common.h

#ifndef COMMON_H
#define COMMON_H

template <typename type>
void swap(type *a, type *b);

#endif

2.文件common.cpp

#include "common.h"

template <typename type>
void swap(type *a, type *b)
{
type temp;
temp = *a;
*a = *b;
*b = temp;
}

3.文件main.cpp

#include "common.h"

using namespace std;

int main(int argc, char *argv[])
{
int data[] = {9,6};
swap<int>(&data[0], &data[1]);
system("PAUSE");
return 0;
}


编译时老报错: [Linker error] undefined reference to `void swap<int>(int*, int*)'
请问大家:函数模板的定义和实现是不是不能分开?
谢谢了
...全文
128 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengwei1984222 2004-12-26
  • 打赏
  • 举报
回复
普通函数在调用时不需要查看定义的,所以可以分开
zhengwei1984222 2004-12-26
  • 打赏
  • 举报
回复
这是因为函数模板要经过两遍编译(如果它被调用的话!)
第一遍:编译模板函数本身,也就是你的.文件common.cpp
这遍能检查出语法上的错误
template <typename type>
void swap(type *a, type *b)
{
type temp;
temp = *a;
*a = *b;
*b = temp;
}
第二遍:函数模板实例话的时候,也就是在你的文件main.cpp中当调用swap<int>(&data[0], &data[1]);的时候。这遍主要看调用是否合乎语义
此时函数模板被实例化swap《int》,编译器要检查实例化成int能否满足语义,于是要查看模板函数的定义。
而.h文件中没有定义只有声名,这就是原因。
所以最好用包含模型,若分开可用预编译,对楼主的问题就没必要如此麻烦了
aleon 2004-12-25
  • 打赏
  • 举报
回复
如楼上所说,把模板的定义和声明放在一起
jensenlv 2004-12-25
  • 打赏
  • 举报
回复
用的是Dev-C++
OK,谢谢各位了
hujiiori 2004-12-25
  • 打赏
  • 举报
回复
你用的编译器不支持模板的分离编译

改成用包含编译,模板声明和定义放在一个文件里就没错了
jensenlv 2004-12-25
  • 打赏
  • 举报
回复
是啊,模板的定义和声明放在一起是没有问题的。
但它为什么不能和普通函数那样可以分开写呢?
好迷惑啊
  • 打赏
  • 举报
回复
很难理解。
函数模版,一个让我头疼的东西。
avalonBBS 2004-12-25
  • 打赏
  • 举报
回复
用包含编译模式
liem 2004-12-25
  • 打赏
  • 举报
回复
模板在头文件中定义
zhangfjj 2004-12-24
  • 打赏
  • 举报
回复
不是最好,而是应该把模板的定义与声明放一起,如头文件中
goodluckyxl 2004-12-24
  • 打赏
  • 举报
回复
最好使用包含模型

定义声明放一起

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧