5

有人可以提示编译器如何处理表达式,例如

class DerivedA: public ParentTemplateClass<DerivedA>{
}

对于我来说,它看起来像:

这个男孩的父亲是这个男孩的“儿子”

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

是的,网上有一些文章描述了这种东西的用法,例如一篇关于 Curiously Recurring Template Pattern ( http://en.wikibooks.org/wiki/More_C++_Idioms/Curiously_Recurring_Template_Pattern ) 的文章,但这不是某种标准或靠近 必须有明确的行为描述,例如操作排序,不是吗?

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

4

3 回答 3

6

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

于 2012-09-11T12:26:18.987 回答
3

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

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

于 2012-09-11T12:33:17.957 回答
1

我认为要理解它是如何工作的,你需要更多地了解一般的 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#disambiguation

于 2012-09-11T12:31:27.193 回答