极度疑惑~无法访问基类模板的public函数,而是访问private的~

norains 2009-08-13 11:46:12
先上代码:

这是基类模板:

template <typename TYPE_INFO>
class CTypeInterface
{
public:

template <typename TYPE_INFO>
void Analyze()
{
};

template<>
void Analyze<int>()
{
};

public:
CTypeInterface()
{};

virtual ~CTypeInterface()
{};

private:
virtual void Analyze(int iCount) = 0;
};



这是派生类


class CTypeDerive:
public CTypeInterface<RECT>
{
public:
using CTypeInterface::Analyze;

private:

virtual void Analyze(int iCount)
{};

public:
CTypeDerive()
{};

virtual ~CTypeDerive();


};


这是调用


int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
CTypeDerive derive;

derive.Analyze();//这里编译会出错,提示error C2660: 'CTypeDerive::Analyze' : function does not take 0 arguments

return 0;
}



从编译错误来看,应该是调用了派生类的private Analyze函数,但我在派生类的public域已经用using来指示模板基类的Analyze,不知道为什么还是会出现这种情况?

望高手解答,谢谢~
...全文
186 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
norains 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yshuise 的回复:]
要想调用模板,需要显示的调用。
因为模板函数的优先级不如普通函数,下面的代码已经测试通过了:
C/C++ code#include"stdafx.h"

template<typename TYPE_INFO>class CTypeInterface
{public:

template<typename TYPE_INFO>void Analyze()
{
};

template<>void Analyze<int>()
{
};public:
CTypeInterface()
{};virtual~CTypeInterface()
{};private:virtualvoid Analyze(int iCount)=0;
};class CTypeDerive:public CTypeInterface<int>
{public:using CTypeInterface::Analyze;public:virtualvoid Analyze(int iCount) {};public:
CTypeDerive() {};virtual~CTypeDerive(){};
};int _tmain(int argc, _TCHAR* argv[])
{

CTypeDerive derive;

derive.Analyze<int>();return0;
}

[/Quote]

嗯,确实可以编译通过了~~

呃。。。。看来模板有时候考虑的还不能像平时函数啊。。。

解决我一个大问题了,非常谢谢~~~
f22fbi 2009-08-13
  • 打赏
  • 举报
回复
CTypeDerive::Analyze要接受一个int参数的
报的是参数不匹配
fblgzdq 2009-08-13
  • 打赏
  • 举报
回复
d
yshuise 2009-08-13
  • 打赏
  • 举报
回复
要想调用模板,需要显示的调用。
因为模板函数的优先级不如普通函数,下面的代码已经测试通过了:
#include "stdafx.h"

template <typename TYPE_INFO>
class CTypeInterface
{
public:

template <typename TYPE_INFO>
void Analyze()
{
};

template<>
void Analyze<int>()
{
};

public:
CTypeInterface()
{};

virtual ~CTypeInterface()
{};

private:
virtual void Analyze(int iCount) = 0;
};


class CTypeDerive: public CTypeInterface<int>
{
public:
using CTypeInterface::Analyze;
public:
virtual void Analyze(int iCount) {};
public:
CTypeDerive() {};
virtual ~CTypeDerive(){};
};

int _tmain(int argc, _TCHAR* argv[])
{

CTypeDerive derive;

derive.Analyze<int>();
return 0;
}

norains 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yshuise 的回复:]
下面就能通过了,但是不知道你想达到什么目的:
还有一个错误,就是子类的析构函数需要定义:
C/C++ code#include"stdafx.h"

template<typename TYPE_INFO>class CTypeInterface
{public:

template<typename TYPE_INFO>void Analyze()
{
};

template<>void Analyze<int>()
{
};public:
CTypeInterface()
{};virtual~CTypeInterface()
{};private:virtualvoid Analyze(int iCount)=0;
};class CTypeDerive:public CTypeInterface<int>
{public:using CTypeInterface::Analyze;public:virtualvoid Analyze(int iCount) {};public:
CTypeDerive() {};virtual~CTypeDerive(){};
};int _tmain(int argc, _TCHAR* argv[])
{

CTypeDerive derive;

derive.Analyze(0);return0;
}

[/Quote]

确切地说,我是想调用CTypeInterface的public域的Analyze(也就是不带形参的这个函数:void Analyze()),而不是基类中带形参的Analyze(int iCount)这个。
LeonTown 2009-08-13
  • 打赏
  • 举报
回复
mark
yshuise 2009-08-13
  • 打赏
  • 举报
回复
下面就能通过了,但是不知道你想达到什么目的:
还有一个错误,就是子类的析构函数需要定义:
#include "stdafx.h"

template <typename TYPE_INFO>
class CTypeInterface
{
public:

template <typename TYPE_INFO>
void Analyze()
{
};

template<>
void Analyze<int>()
{
};

public:
CTypeInterface()
{};

virtual ~CTypeInterface()
{};

private:
virtual void Analyze(int iCount) = 0;
};


class CTypeDerive: public CTypeInterface<int>
{
public:
using CTypeInterface::Analyze;
public:
virtual void Analyze(int iCount) {};
public:
CTypeDerive() {};
virtual ~CTypeDerive(){};
};

int _tmain(int argc, _TCHAR* argv[])
{

CTypeDerive derive;

derive.Analyze(0);
return 0;
}

taodm 2009-08-13
  • 打赏
  • 举报
回复
模板+重载就已经规则很复杂了,你还在加特化,想搞晕谁?
norains 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 healer_kx 的回复:]
其实问题很简单,这个决定于编译器检查顺序,
编译器是先检查参数匹配,而后检查访问性的。


[/Quote]

如果是参数匹配,那么更应该调用的是CTypeInterface的Analyze了,而不是提示“error C2660: 'CTypeDerive::Analyze' : function does not take 0 arguments”
norains 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yshuise 的回复:]
楼主再检查一下,错误很多,用的什么编译器?

[/Quote]

用的是VS2005
norains 2009-08-13
  • 打赏
  • 举报
回复
如果模板函数不使用函数特化的话,就能正常编译通过。

例如,CTypeInterface可以更改为如此,就能正常编译:


template <typename TYPE_INFO>
class CTypeInterface
{
public:
void Analyze()
{
};

public:
CTypeInterface()
{};

virtual ~CTypeInterface()
{};

private:
virtual void Analyze(int iCount) = 0;
};


但我在实际使用中,必须要用特化。。。但函数特化之后,就会出问题。
yshuise 2009-08-13
  • 打赏
  • 举报
回复
楼主再检查一下,错误很多,用的什么编译器?
yshuise 2009-08-13
  • 打赏
  • 举报
回复

你是用子类对象直接访问其类成员,这样就同虚函数没有关系了(指针或引用才会有虚函数的性质),
那么,这时最匹配的显然就是 virtual void Analyze(int iCount)
{};但是这个访问权限受限,所以报错。
healer_kx 2009-08-13
  • 打赏
  • 举报
回复
其实问题很简单,这个决定于编译器检查顺序,
编译器是先检查参数匹配,而后检查访问性的。

pengzhixi 2009-08-13
  • 打赏
  • 举报
回复
也就是说你在基类里面 Analyze是private的,那么你在派生类里面你不可能把它提升为public
pengzhixi 2009-08-13
  • 打赏
  • 举报
回复
using 并不能提升基类里面的函数在派生类里面的访问级别。
healer_kx 2009-08-13
  • 打赏
  • 举报
回复
接分,等待高手。

64,282

社区成员

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

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