试图了解模板类是如何工作的
Posted
技术标签:
【中文标题】试图了解模板类是如何工作的【英文标题】:trying to understand how Template Class works 【发布时间】:2017-02-13 21:05:15 【问题描述】:我已经尽我所能完成了这项任务,但我很确定存在根本问题。我会期待你的 cmets 如何让它变得更好。问题定义如下:
两班。 XBoxGame
和 WorldPeace
。
名为Gift
的模板类。有一种称为shake()
的方法。在shake()
中,我们将在模板类型T
的实例上调用MakeNoise()
。只有XBoxGame
有MakeNoise()
作为方法。
现在在main()
中,只要您尝试创建一个包含XBoxGame
的“Gift
”(看看我在那里做了什么?)您会在编译时知道它是否有效。尝试Gift<WorldPeace>
,它不会编译,因为缺少MakeNoise()
。您提交的内容应该只有正确模板化的XBoxGame
类调用shake()
,以及一个可以编译的WorldPeace()
,但这只是因为它没有在main()
中使用。
最终结果“您只能在礼物中放入一个会发出噪音的课程”。 我写的代码:
#include <iostream>
class XBoxGame
void makeNoise(int,int)
std::cout << "Is this Working ? ";
;
;
class WorldPeace
;
template <typename T>
class Gift
public:
T shake()
void XboxGame::makeNoise();
;
主要:
#include "Template.h"
using namespace std;
int main()
Gift <XBoxGame> ;
Gift <WorldPeace>;
return 0;
【问题讨论】:
【参考方案1】:我发现你的代码有一些问题。
排名不分先后……
(1) 在Gift::shake()
中,您调用XboxGame::makeNoise()
,但您使用大写B
(XBoxGame
) 定义了类。
(2)在Gift::shake()
你写
void XBoxGame::makeNoise();
这是一个方法的原型,而不是一个调用
(3) 在Gift::shake()
,如果你删除void
(见第2点),下面的指令
XBoxGame::makeNoise();
成为对makeNoise()
中static
方法的调用XBoxGame
class
;但是您将makeNoise()
定义为非static
方法。
您可以将makeNoise()
定义为static
,或者您可以从实际的XBoxGame
对象中调用;像
T shake()
XBoxGame xbg;
xbg.makeNoise();
甚至
T shake()
XBoxGame().makeNoise();
(4) 你已经(隐式地)将makeNoise()
定义为private
的XBoxGame
方法。如果要在Gift
对象中调用它,则必须将其声明为public
(或将XBoxGame
定义为struct
,因此将makeNoise()
隐式声明为public
(5) 你在XBoxGame
中定义了makeNoise()
,作为一个接收几个(未使用的)int 值的方法,但你在没有参数的情况下调用它;你必须纠正这一点;一个解决方案可以通过几个int
s 调用它;举例
T shake()
XBoxGame().makeNoise(0, 0);
(6) 在main()
中,按照说明进行
Gift <XBoxGame>;
Gift <WorldPeace>;
什么都不声明;你应该给几个变量取几个名字
Gift<XBoxGame> gx;
Gift<WorldPeace> gv;
或在创建几个临时对象时对其进行转换(避免几个“未使用的变量”警告)
Gift<XBoxGame>();
Gift<WorldPeace>();
(7) 如果您想查看“这是否有效?”消息,您必须调用shake()
方法
Gift<XBoxGame>().shake();
Gift<WorldPeace>().shake();
(8) 你的shake 方法被声明为返回T
但什么也不返回;这是一个您可以解决的问题,例如,将其定义为 void
方法
void shake()
XBoxGame().makeNoise(0, 0);
所以,下面的代码编译了
#include <iostream>
class XBoxGame
public:
void makeNoise(int,int)
std::cout << "Is this Working ? " << std::endl; ;
;
class WorldPeace
;
template <typename T>
class Gift
public:
void shake()
XBoxGame().makeNoise(0, 0);
;
int main()
Gift<XBoxGame>().shake();
Gift<WorldPeace>().shake();
希望这会有所帮助。
-- 编辑--
(9) 不确定是否理解,但是,如果您只想编译 Gift<XBoxGame>
(因为只有 XBoxGame
实现 makeNoise()
,我想您应该使用 T
类型编写 shake()
;所以类似
void shake()
T().makeNoise(0, 0);
如果makeNoise()
是XBoxGame
中的普通方法或者
void shake()
T::makeNoise(0, 0);
如果makeNoine()
是static
方法。
【讨论】:
非常感谢 max66。你完美地解释了一切,我理解我所有的问题。谢谢以上是关于试图了解模板类是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章