分页: 1 / 1

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

发表于 : 2006-06-22 19:23
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 函数写好这一个选择呢?

谢谢!

发表于 : 2006-06-24 9:03
madoldman
应该是
template < class T >
void Test<T>::swap( T* arr, int i, int j )
{
}
记得好像是这样的

发表于 : 2006-06-24 11:13
ydong
从一个朋友那里证实了。模板定义不能分开,只能一次性写完

发表于 : 2006-06-24 12:58
madoldman
模板定义不能分开??

发表于 : 2006-06-25 0:17
ydong
就是说不能像一般的函数那样在头文件里声明,在源文件里实现。

发表于 : 2006-06-25 19:25
zhan
好像是这样的,记得当年学习 c++的时候老师说过的,晕,都忘到爪哇国去了~

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

发表于 : 2006-06-26 11:30
lovepolo
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 函数写好这一个选择呢?

谢谢!

发表于 : 2006-06-26 12:55
ydong
显式初始化?什么意思?

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

发表于 : 2006-07-12 1:07
ydong
好的,谢谢