使用模板和Typedef类的程序输出
Program output with template and typedef classes
#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>>
。因此,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().
};
};
第3行:
与第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
。]
相关文章:
- 如何从Windows应用程序输出到标准?
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- 而循环:简单的除法程序输出零,不明白为什么
- Qt creator 4.11,在应用程序输出面板中创建一个链接
- 使用复制构造函数的程序输出错误
- 为什么Qt Creator的应用程序输出不能从spdlog记录器打印
- 为什么在 Direct X 11 中没有我的程序输出?
- 我怎样才能阻止我的程序输出时间,它使我的程序难以阅读
- 程序输出奇怪的字符
- 程序输出"nan"
- 为什么我的C++程序输出不同的数字来将米转换为英尺?
- 3D 纹理大小会影响程序输出,而不会引发错误
- C++,程序输出无效输入,但继续通过循环
- 如何连接C++和Excel(从C++程序输出到Excel电子表格)
- 为什么我的C 程序输出乱码代码
- QT小部件应用程序输出到控制台
- 混淆了具有虚拟继承的程序输出
- 为什么我的C++程序输出这个
- 为什么我的程序输出不断变化?EAX寄存器不断更改值