C++:template<class>是什么意思?

7

我正在尝试理解一些C++代码。作为一名有经验的Java程序员,我正在尝试学习C ++。我已经阅读了一些详尽的关于模板的文章,但没有一个回答了我下面这个模板规范的含义。

template<
    template<template<class> class, class> class VisualOdometryTT, 
    template<class> class NodeBuilderTT,
    class PoseGraphT> 
class VORosInterface{ ... };

我不明白的部分是template<class>,我想有一些类型规范是缺失的。但是代码可以顺利编译。


4
搜索 "template template parameters"。 - juanchopanza
1个回答

7

NodeBuilderTT为例,因为它更容易理解:

NodeBuilderTT是一个模板参数,它本身是一个模板,有一个参数--让我们称其为Z

你可以选择正式命名Z,代码仍然可以编译:

template<class Z> class NodeBuilderTT

到目前为止,这与声明函数参数非常相似。
void foo(int x) {}   // works
void foo(int)   {}   // also works

然而,在函数内部,您通常会使用名称x。但是在模板中,您不能在VORosInterface的定义中使用Z,因此命名它毫无意义,惯用的写法是:

template<class> class NodeBuilderTT

感谢K-ballo在这里帮助澄清问题。

2
即使你足够在意给它命名,由于你无法使用它,这个名字也毫无意义。 - K-ballo
谢谢解释!现在我明白了,但是我越深入研究C++,就越喜欢Java :-D - Martin Pecka
1
@peci1:确切地说,在这里T是没有意义的,因为该参数需要一个类模板而不是一个实例化模板。T是一个没有相应参数的参数。 - K-ballo
Jon:你回答的第一部分非常到位,不需要删除它。只需删除第二部分并添加说给_template模板参数的参数命名是没有意义的即可。 - K-ballo
4
更贴切的比喻是将函数指针作为函数参数:在 void f( void (*ptr)(int n) ) {} 中,你实际上无法使用 n。请注意,我已经尽力让翻译更通俗易懂,但并未改变原意。 - aschepler
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接