假设有以下类模板定义:
// Test.h
template<class T>
class Test
...{
public:
struct TS
...{
int j ;
} ;
public:
TS* test1() ;
} ; 注意,模板Test内还包含了类TS的定义。
那么,实现文件特别是test1函数的定义应该怎么写才能保证正确呢?经过向高人请教,终于获得答案:
// Test.cpp
template<class T>
typename Test<T>::TS* Test<T>::test1()
...{
return NULL ;
}
关键问题在于在通常情况下,类模板内含的复合类型在实现文件里引用时总不能被识别,加上typename关键字的目的就是要告诉编译器,后面跟着的是一个数据类型,让编译器加以区别对待。
有了今天跟昨天的技巧,把类模板分离在头文件和cpp文件里应该不成问题了。
本文介绍了如何在C++类模板实现中正确引用并定义内部复合数据类型,如结构体TS。在实现文件中定义`test1`函数时,需使用`typename Test<T>::TS*`来明确告知编译器`TS`是一个类型,从而避免编译错误。了解这一技巧将有助于理解如何分离类模板的声明和实现。

1036

被折叠的 条评论
为什么被折叠?



