2012-07-05 34 views
9

我正在寻找其他与模板模板参数相关的其他内容,并且发生在this answer之后,该模板模板参数声明而非标准允许的模板模板参数是模板参数的扩展还是标准的一部分?

但是,下面的代码编译的最新铛(3.2)和最新的GCC(4.8):

template<template<template<typename> class> class T> struct test {}; 
template<template<typename> class T> struct foo {}; 
test<foo> bar; 

这是一个扩展,或者是其他的答案其实不正确的,它是由允许标准?如果没有,是否有任何特别的原因导致遗漏?

+0

@chris OP可能意味着快照4.8。我一直在使用一个。 – juanchopanza

+0

是啊,我有来自MacPorts的快照...所以,可能不是最新的svn或类似的东西。 – celticminstrel

+0

它也编译在Ideone上的gcc 4.5 http://ideone.com/BUAuw – TemplateRex

回答

8

std::vector<int>类模板std::vector传递作为参数的类型int。在std::get<42>(some_tuple)中,函数模板std::get传递值42作为参数。也许没有想象力的前一种参数称为模板(或模板类型参数)的类型参数,而后一种类型是(模板)非类型参数。

但模板也可以接受另一种参数:其他模板。例如,template<template<typename> class T> void foo();声明一个函数模板,它将一个模板作为参数,它本身带有一个类型参数。 (注意,虽然模板不是类型,但“非类型参数”一词仍不包括模板模板参数,它保留用于参数,如template<int NonTypeArgument>。)

由于在模板模板中没有这样的东西C++(有类,函数和别名模板 - 但它们总是简单的'模板'),没有模板模板参数这样的事情。你有什么是跑磨工模板模板参数,其中预期的模板参数有一个模板模板参数本身。我无法在标准中找到禁止这一点的参考文献,就像您链接索赔的答案一样。