使用模板和Typedef类的程序输出

Program output with template and typedef classes

本文关键字:程序 输出 Typedef      更新时间:2023-10-16
#include <iostream>
using namespace std;
class A{
public: 
      void K()
       {
          cout<<"1";
       };
};
class B{
public: typedef A T;
      void K()
      {
          cout<<"2";
      };
};
class C{
public:
      void K()
      {
          cout<<"3";
      };
};
class D{
    public:
    void K()
    {
        cout<<"4";
    };
};
template <class D=A> class E{
public: typedef D T;
    void K()
    {
       cout<<"5";
    };
};
template <> class E<A>{
public:typedef C T;
    void K()
    {
        cout<<"6";
    };
};
template <>class E<C>{
public:typedef B T;
     void K()
     {
       cout<<"7";
     };
};
template <class W, class V=E<W> >
class F{
typedef typename V::T R;
public:
     void K()
     {
         V().K();
         W().K();
         R().K();
    };
};
  int main(){
  E<>().K();
  F<A>().K();
  F<C>().K();
  return 0;
}

我无法探索为什么程序输出为6-612-732。如果有人可以帮助我该程序的工作方式,即使是Main的第一行,也会很棒。如果有人可以告诉我为什么第一个cout是6个逐步的,woudl真是太棒了。

这将是由于模板订购规则所致。让我们更仔细地检查事物。

int main(){
  E<>().K();  // Line 1.
  F<A>().K(); // Line 2.
  F<C>().K(); // Line 3.
  return 0;
}

第1行:

在这里,我们正在尝试匹配模板模式E<>。我们的选择是:

// Primary template.
template <class D=A> class E{
public: typedef D T;
    void K()
    {
       cout<<"5";
    };
};
// Specialisation for A.
template <> class E<A>{
public:typedef C T;
    void K()
    {
        cout<<"6";
    };
};
// Specialisation for C.
template <>class E<C>{
public:typedef B T;
     void K()
     {
       cout<<"7";
     };
};

编译器检查主模板,并发现默认参数为 A;因此,它填充了空白,将模板解析为E<A>。这会导致它匹配其中一个专业,因此选择专业。

  E<>().K();  // Calls E<A>::K().

第2行。

与第1行一样,由于未指定参数之一,编译器填充了空白,将模板解析为F<A, E<A>>。因此,WAVE<A>,R为E<A>::TC。这解决了以下函数被调用:

template <class W, class V=E<W> >
class F{
typedef typename V::T R;
public:
     void K()
     {
         V().K(); // Calls E<A>::K().
         W().K(); // Calls A::K().
         R().K(); // Calls C::K().
    };
};

第3行:

与第2行一样,编译器填充空白,解决至F<C, E<C>>。因此,WCVE<C>RE<C>::TB。这解决了以下函数被调用:

template <class W, class V=E<W> >
class F{
typedef typename V::T R;
public:
     void K()
     {
         V().K(); // Calls E<C>::K().
         W().K(); // Calls C::K().
         R().K(); // Calls B::K().
    };
};

现在我们已经解决了模板...

int main(){
  E<>().K();  // E<A>::K().
  F<A>().K(); // F<A, E<A>>::K() -> E<A>::K(), A::K(), C::K().
  F<C>().K(); // F<C, E<C>>::K() -> E<C>::K(), C::K(), B::K().
  return 0;
}

因此,输出为...

6613732

[注意:如果您的编译器给您输出6612732,则不应该这样做。Clang,GCC和MSVC都同意,此处的适当输出是6613732。]