2012-07-05 31 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++(有類,函數和別名模板 - 但它們總是簡單的'模板'),沒有模板模板參數這樣的事情。你有什麼是跑磨工模板模板參數,其中預期的模板參數有一個模板模板參數本身。我無法在標準中找到禁止這一點的參考文獻,就像您鏈接索賠的答案一樣。