Chinaunix首页 | 论坛 | 博客
  • 博客访问: 299174
  • 博文数量: 148
  • 博客积分: 4365
  • 博客等级: 上校
  • 技术积分: 1566
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 21:38
文章分类
文章存档

2014年(2)

2013年(45)

2012年(18)

2011年(1)

2009年(54)

2008年(28)

我的朋友

分类: C/C++

2013-01-15 22:31:43

Item 43: Know how to access names in templatized base

看下面的程序:

template 
class base
{
public:
	T var;
	void print(){cout<<"in T Base \n";}
};

template 
class de: public base
{
	void dp(){print();}
};
编译是会报错的:


test.cpp: In member function 'void de::dp()':
test.cpp:63:18: error: there are no arguments to 'print' that depend on a template parameter, so a declaration of 'print' must be available [-fpermissive]
test.cpp:63:18: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)


派生类dp函数中调用基类的print,看着毫无问题,可在编译时编译器并不知道base是什么东东(或者是否有针对其的特化),print是否为其成员,所以找不到print这个名字。


通过下面的方法可以通过编译

方法一:使用this指针

    void dp(){this->print();}


方法二:使用using语句

template 
class de: public base
{
	using base::print;
	void dp(){print();}
};
方法三:直接域作用符调用
template 
class de: public base
{
	void dp(){base::print();}
};

涉及到虚函数时,推荐使用第一种。 


阅读(581) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~