请教一个模板类的特例化问题

miyukihj 2012-04-11 02:54:23
打算写一个集合模板类,它的主要功能是可以打印集合中的元素,模板类的声明如下:

//*****************************************************
template <typename T> class Aggregate
{
public:
void append(T& val); //添加元素
void printMember(); //打印元素

private:
CArray<T> m_list; //成员的实际存储
};
//***************************************************
以及两个成员函数的一般实现和 printMember()的整型的特例化实现:
//***************************************************
template<typename T>
void Aggregate<T>::append(T &val)
{
m_list.Add(val);
}

template<typename T>
void Aggregate<T>::printMember()
{
//什么也不做
}

template<>
void Aggregate<int>::printMember()
{
int num=m_list.GetCount();
printf("输出整数集合--\n");
for(int i=0; i<num; i++)
{
printf("mem%d %d\n",(i+1), num);
}
}

//****************************************************

现在的问题是,我需要对printMember做一个特例化,希望当m_list存储的是一个Aggregate <T> *时,能递归的调用printMember,从而实现打印内嵌的集合中的每个元素。
我是这样的写的,但是编译不过:
template<> template<typename T>
void Aggregate< Aggregate <T> *>::printMember()
{
int num=m_list.GetCount();
printf("输出包含集合--\n");
for(int i=0; i<num; i++)
{
Aggregate<T> * ele=m_list.GetAt(i);
ele->printMember();
}
} //这一行出错 错误 error C2244: “Aggregate<T>::printMember”: 无法将函数定义与现有的声明匹配


请问有没有可能实现这样的特例化成员函数,特例化的对象是某个模版?
还请各位高手不吝赐教!


...全文
248 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
深圳小北 2012-04-11
  • 打赏
  • 举报
回复
楼主你好,我也在研究template 和 modern C++ design , 能一起学习不?
我的QQ872322063
miyukihj 2012-04-11
  • 打赏
  • 举报
回复
谢谢各位,经过大家提示我意识到特化模板类和特化类成员函数的区别,所以我尝试先特例化模板类:
//-----------------------特例化的class Aggregate-----------------------------------
template <typename T> class Aggregate< Aggregate<T> *>
{
public:
void append( Aggregate<T> * & val);
void printMember( Aggregate<T>* & val);
private:
CArray< Aggregate<T> *> m_list;
};

//------------------------实现我想实现的函数-----------------------------------------
template <typename T>
void Aggregate< Aggregate<T> *> ::printMember( Aggregate<T>* & val)
{
int num=m_list.GetCount();
printf("输出包含集合--\n");
for(int i=0; i<num; i++)
{
Aggregate<T> * ele=m_list.GetAt(i);
ele->printMember();
}
}

//编译通过。

不过模板类中的append函数可能也得跟着实现一下。比较笨。

不知道各位大虾说的特例化成员函数具体怎么做呢,请给点提示,谢谢。
pengzhixi 2012-04-11
  • 打赏
  • 举报
回复
按照3L的方法将printMember本身也声明定义为一个模板函数。
然后提供相应的偏特化的重载版本。
ohayou 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
你应该把你的printMember成员函数声明成成员模板函数
[/Quote]
+1
惬意 2012-04-11
  • 打赏
  • 举报
回复
你应该把你的printMember成员函数声明成成员模板函数

Jim_King_2000 2012-04-11
  • 打赏
  • 举报
回复
Google “模板的模板参数”。
miyukihj 2012-04-11
  • 打赏
  • 举报
回复
是否和编译器有关,我用的VC2005

64,643

社区成员

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

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