使用template和typedef类编程输出

时间:2016-11-28 23:51:13

标签: c++ templates

K

我无法理解为什么程序输出是6 - 612 - 732.如果有人可以帮助我这个程序如何工作它会很棒,即使有第一行主。如果有人能告诉我为什么第一个cout是一步一步,这真是太棒了。

1 个答案:

答案 0 :(得分:0)

这可能是由于模板订购规则造成的。让我们更仔细地研究一下。

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。]