0

我已经尽我所能完成了这项任务,但我很确定存在根本问题。我将期待您对如何使其变得更好的评论。问题定义如下: 两个类。 XBoxGameWorldPeace

模板类称为Gift. 有一种方法称为shake(). 在里面shake(),我们将调用MakeNoise()我们的模板类型的一个实例T。只有XBoxGame作为MakeNoise()一种方法。

现在,main()只要您尝试制作一个Gift包含“”的XBoxGame“”(看看我在那里做了什么?),您就会在编译时知道它是否有效。尝试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;
}
4

1 回答 1

0

我在您的代码中看到了一些问题。

没有特别的顺序...

(1) 在Gift::shake()您调用中,但您使用大写( )XboxGame::makeNoise()定义了类。BXBoxGame

(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为 a struct,因此隐式声明makeNoise()public

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

  T shake()
   { XBoxGame().makeNoise(0, 0); }

(6) 在main(), le 遵循指令

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(),我想你应该shake()使用T类型编写;所以像

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

ifmakeNoise()XBoxGameor中的普通方法

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

ifmakeNoine()是一种static方法。

于 2017-02-13T22:51:51.217 回答