模板类构造函数初始化列表的限制

Arcticanimal 2011-02-14 04:15:07
今天coding的时候发现了一个问题


struct base_t
{
void* p;
};

template<typename T>struct child_t: public base_t
{
child_t(T* t): base_t::p(t){} // ERROR

child_t(T* t){ p = t; } // OK
};

int main(int argc, char* argv[])
{
int a = 0;
child_t<int> c(&a);

return 0;
}


child_t 第一种构造函数在初始化列表中初始化基类成员, 编译无法通过,说"p"不是实例类型的成员
而第二种构造函数在函数体中给基类成员赋值却可以编译通过。(Win+VC/HP-UX+aCC都测试过了)

难道编译器是在展开初始化列表之后才去实例化模板? 还是初始化列表有什么限制?
对泛型编程不是很在行,求砖家解答。
...全文
478 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
还是这个解释得清楚
[Quote=引用 8 楼 jim_king_2000 的回复:]

In the definition of a constructor for a class, initializers for direct and virtual base subobjects and non-static data members
can be specified by a ctor-initializer, ...
from C++ Specification

……
[/Quote]
  • 打赏
  • 举报
回复

struct base_t
{
void* p;
base_t(void* t) : p(t) {}
};

template<typename T>struct child_t: public base_t
{
child_t(T* t): base_t(t){}
};

这样不就可以了嘛
Jim_King_2000 2011-02-14
  • 打赏
  • 举报
回复
In the definition of a constructor for a class, initializers for direct and virtual base subobjects and non-static data members
can be specified by a ctor-initializer, ...
from C++ Specification

也就是说,初始化列表里面必须是直接基类或者虚基类的初始化器和自己类的非静态成员。直接基类的非静态成员不可以位于初始化列表中。

Effective C++建议:把所有成员都变成private。这样,就不会出现lz的问题。毕竟,让派生类去修改基类的成员变量这样的行为,增加了派生类和基类的耦合,是非常不好的。
  • 打赏
  • 举报
回复
和模板无关,你不是模板这样做也是错的
p应该在自己的构造函数也就是base_t()的初始化列表里初始化
这和继承类的构造函数调用顺序有关
modaoshi3002 2011-02-14
  • 打赏
  • 举报
回复
写错成员名了

template<typename T>struct child_t
{
private:
T* p;
public:
child_t(T* t){ p = t; }
};


modaoshi3002 2011-02-14
  • 打赏
  • 举报
回复


struct base_t
{
void* p;
};

template<typename T>struct child_t: public base_t
{
//child_t(T* t): base_t::p(t){} // ERROR

child_t(T* t){ p = t; } // OK, p是指针,可以赋值,struct默认public,所以child_t也包含p
//不要再像上一句去使用基类的p。
};


其实你不需要去继承一个base
可以直接把p放在child_t中,给予一个泛型T作为类型

template<typename T>struct child_t
{
private:
T* t;
public:
child_t(T* t){ p = t; }
};
bdmh 2011-02-14
  • 打赏
  • 举报
回复
base_t::p(t),你这不相当于创建一个实例吗
Arcticanimal 2011-02-14
  • 打赏
  • 举报
回复
晕菜 搞错了
Arcticanimal 2011-02-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]

因为p是个指针,你怎么去给他创建实例呢,赋值当然可以了
[/Quote]
不是要创建实例,是初始化
bdmh 2011-02-14
  • 打赏
  • 举报
回复
因为p是个指针,你怎么去给他创建实例呢,赋值当然可以了

64,654

社区成员

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

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