K
我无法理解为什么程序输出是6 - 612 - 732.如果有人可以帮助我这个程序如何工作它会很棒,即使有第一行主。如果有人能告诉我为什么第一个cout是一步一步,这真是太棒了。
答案 0 :(得分:0)
这可能是由于模板订购规则造成的。让我们更仔细地研究一下。
int main(){
E<>().K(); // Line 1.
F<A>().K(); // Line 2.
F<C>().K(); // Line 3.
return 0;
}
在这里,我们尝试匹配模板模式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().
与第1行一样,由于未指定其中一个参数,编译器会填充空白,将模板解析为F<A, E<A>>
。因此,W
为A
,V
为E<A>
,R为E<A>::T
或C
。这解决了以下被调用的函数:
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().
};
};
与第2行一样,编译器填写空白,解析为F<C, E<C>>
。因此,W
为C
,V
为E<C>
,R
为E<C>::T
或B
。这解决了以下被调用的函数:
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
。]