[问题]c++ 泛型函数有个问题[OK]

软件和网站开发以及相关技术探讨
回复
头像
ydong
帖子: 63
注册时间: 2006-06-03 16:49

[问题]c++ 泛型函数有个问题[OK]

#1

帖子 ydong » 2006-06-22 19:23

我在头文件里声明个泛型函数: functions.h
namespace Test
{
// 泛型函数
// 交换指定数组 arr 中索引 i 和 j 处的值
template < class T >
void
swap( T* arr, int i, int j );
}

现在,加一个源文件: functions.cc
#include "./include/functions.h"

namespace Test
{
// 泛型函数
// 交换指定数组 arr 中索引 i 和 j 处的值
Test::
template < class T >
void
swap( T* arr, int i, int j )
{
T tmp = arr;
arr = arr[j];
arr[j] = tmp;
}
}

但是这样会报错说 template 怎么样怎么样;如果不写 template 关键字又说 T 未声明。我是不是只有在头文件中就把 swap 函数写好这一个选择呢?

谢谢!
上次由 ydong 在 2006-07-12 1:09,总共编辑 1 次。
头像
madoldman
帖子: 599
注册时间: 2006-02-27 20:19
来自: works system
联系:

#2

帖子 madoldman » 2006-06-24 9:03

应该是
template < class T >
void Test<T>::swap( T* arr, int i, int j )
{
}
记得好像是这样的
东西路,南北走
十字路口人咬狗
拿起狗来打砖头
砖头咬了狗一口
图片
头像
ydong
帖子: 63
注册时间: 2006-06-03 16:49

#3

帖子 ydong » 2006-06-24 11:13

从一个朋友那里证实了。模板定义不能分开,只能一次性写完
头像
madoldman
帖子: 599
注册时间: 2006-02-27 20:19
来自: works system
联系:

#4

帖子 madoldman » 2006-06-24 12:58

模板定义不能分开??
东西路,南北走
十字路口人咬狗
拿起狗来打砖头
砖头咬了狗一口
图片
头像
ydong
帖子: 63
注册时间: 2006-06-03 16:49

#5

帖子 ydong » 2006-06-25 0:17

就是说不能像一般的函数那样在头文件里声明,在源文件里实现。
头像
zhan
帖子: 1880
注册时间: 2005-08-15 0:04
来自: 南7技校

#6

帖子 zhan » 2006-06-25 19:25

好像是这样的,记得当年学习 c++的时候老师说过的,晕,都忘到爪哇国去了~
飞得高,飞得低,学习再学习,多少大秘密!
http://zhan.blog.ubuntu.org.cn
lovepolo
帖子: 32
注册时间: 2006-06-26 11:27

Re: c++ 泛型函数有个问题

#7

帖子 lovepolo » 2006-06-26 11:30

explicit instantiation...

otherwise, how can the compiler decides how much space allocated to 'T'?
ydong 写了:我在头文件里声明个泛型函数: functions.h
namespace Test
{
// 泛型函数
// 交换指定数组 arr 中索引 i 和 j 处的值
template < class T >
void
swap( T* arr, int i, int j );
}

现在,加一个源文件: functions.cc
#include "./include/functions.h"

namespace Test
{
// 泛型函数
// 交换指定数组 arr 中索引 i 和 j 处的值
Test::
template < class T >
void
swap( T* arr, int i, int j )
{
T tmp = arr;
arr = arr[j];
arr[j] = tmp;
}
}

但是这样会报错说 template 怎么样怎么样;如果不写 template 关键字又说 T 未声明。我是不是只有在头文件中就把 swap 函数写好这一个选择呢?

谢谢!
头像
ydong
帖子: 63
注册时间: 2006-06-03 16:49

#8

帖子 ydong » 2006-06-26 12:55

显式初始化?什么意思?
头像
ectotherm
帖子: 225
注册时间: 2006-05-23 13:35
联系:

#9

帖子 ectotherm » 2006-07-11 17:27

在对 C++98 乃至 C++03 的标准的实现过程中,几乎所有的 C++ 编译器都忽略了关键字 export 的实现(只有一个 compiler 实现了,但是叫什么一时忘了,反正用的人少)。没有实现 export 的结果就是 template member function 的实现必须要和类定义写在同一个文件中,这在 C++ Templates 中有详细说明(C++ Templates 中还举例了一种面对将来有可能普及的 export 关键字的适配方法)。要注意,是同一个文件中,并不是说一定要写成 inline 的形式,没有 export 是造成无法进行 template link 而不是其它的错误。
头像
ydong
帖子: 63
注册时间: 2006-06-03 16:49

#10

帖子 ydong » 2006-07-12 1:07

好的,谢谢
回复