试图了解模板类是如何工作的

Posted

技术标签:

【中文标题】试图了解模板类是如何工作的【英文标题】:trying to understand how Template Class works 【发布时间】:2017-02-13 21:05:15 【问题描述】:

我已经尽我所能完成了这项任务,但我很确定存在根本问题。我会期待你的 cmets 如何让它变得更好。问题定义如下: 两班。 XBoxGameWorldPeace

名为Gift 的模板类。有一种称为shake() 的方法。在shake() 中,我们将在模板类型T 的实例上调用MakeNoise()。只有XBoxGameMakeNoise() 作为方法。

现在在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方法的调用XBoxGameclass;但是您将makeNoise() 定义为非static 方法。

您可以将makeNoise() 定义为static,或者您可以从实际的XBoxGame 对象中调用;像

  T shake()
   
     XBoxGame xbg;

     xbg.makeNoise();
   

甚至

  T shake()
    XBoxGame().makeNoise(); 

(4) 你已经(隐式地)将makeNoise() 定义为privateXBoxGame 方法。如果要在Gift 对象中调用它,则必须将其声明为public(或将XBoxGame 定义为struct,因此将makeNoise() 隐式声明为public

(5) 你在XBoxGame 中定义了makeNoise(),作为一个接收几个(未使用的)int 值的方法,但你在没有参数的情况下调用它;你必须纠正这一点;一个解决方案可以通过几个ints 调用它;举例

  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&lt;XBoxGame&gt;(因为只有 XBoxGame 实现 makeNoise(),我想您应该使用 T 类型编写 shake();所以类似

  void shake()
    T().makeNoise(0, 0); 

如果makeNoise()XBoxGame中的普通方法或者

  void shake()
    T::makeNoise(0, 0); 

如果makeNoine()static 方法。

【讨论】:

非常感谢 max66。你完美地解释了一切,我理解我所有的问题。谢谢

以上是关于试图了解模板类是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章

我无法覆盖基类的方法,因为我的派生类是模板化的

如何使用模板专门化常量

在外部类中使用类模板时如何定义内部类构造函数?

类与模板注意事项

jdbcTemplate学习

基于视图的 iOS 应用程序模板