c++模板代码顺序解析/CRTP

c++ template code order parsing/CRTP

本文关键字:CRTP 顺序 代码 c++      更新时间:2023-10-16

有人能提示编译器如何处理等表达式吗

class DerivedA: public ParentTemplateClass<DerivedA>{
}

对我来说,它看起来像:

这个男孩的父亲是这个男孩的"儿子"

我的意思是,在不知道父类的确切"描述"的情况下,如何完成DerivedA类的"解析"对我来说并不明显。似乎不能。所以父类必须在子类之前处理,但在这种情况下,父类依赖于子类。。我被困在那里了。

是的,网上有一些文章描述了这种东西的用法,例如一篇关于奇怪重复模板模式的文章(http://en.wikibooks.org/wiki/More_C++_Idioms/Curiously_Recurring_Template_Pattern),但这不是某种标准或标准。必须有明确的行为描述,比如操作顺序,不是吗?

回答:谢谢大家。是的,向前倾斜的比喻对我来说似乎是合法的,可以停止损害我的大脑。模板对我来说仍然是最先进的,因为它隐藏着子语言的性质,我不能只是g++-E:)

在您的代码显示class DerivedA之后,就声明了符号DerviedA。此时,它可以用作模板参数。C++编译器会对代码进行多次传递,因此在解析时,编译器会"相信"您的意图是正确的,并且最终会得到该类的定义(当它即将实例化模板时,即您实际使用了该类型)。如果没有,它会在那时抱怨。如果您在声明中使用了前向声明的类,但在使用它之前没有提供定义,则会发生类似的情况

在实例化模板时,DerivedA不完整;它已被声明,但未被完全定义。不完整类型可以用多种方式使用,例如,您可以声明对它们的指针或引用,将带有它们的函数声明为返回或参数类型,以及其他一些事情。您不能创建对象、继承对象、访问对象的成员,也不能做任何需要比类名更多信息的事情。

只要类模板只做这些事情,就没有问题。

我认为要理解这是如何工作的,你还需要更多地了解C++模板,而不仅仅是奇怪的递归模板模式。其他人可能比我更能回答这个问题,但我知道C++本身无法完全解析模板类定义。每次在代码中使用模板时,它都会实例化模板。如果每个类都在一个单独的包含文件中,可以这样想:

#include "ParentTemplateClass.h" // C++ initially validates the template class definition's syntax.
#include "DerivedA.h" // First use of ParentTemplateClass -
                      //   at this point it becomes fully instantiated.

当C++解析器看到模板定义时,它将首先验证模板的语法。然后,当模板被用作DerivedA的基础时,解析将继续,模板将被完全实例化。当然,这是C++编译器将要做的解析的简化视图,我相信细节会因编译器而异。另请参阅http://womble.decadent.org.uk/c++/template faq.html#消除歧义.