2012-12-15 37 views
1

我正在嘗試模板模板以獲得樂趣。我有以下類:是否可以爲模板參數定義一個別名?

template<template<class> class T, typename R> class Unit 
{  
    using FullType = T<R>; 
    using Ratio = R; 
    //using Type = T; 

    ... 
}; 

我有限定類型RT<R>作爲成員類型RatioFullType。 可以別名T作爲Type

的註釋行上面給我下面的錯誤的G ++ 4.7:

expected nested-name-specifier before 'Type' 
using-declaration for non-member at class scope 
expected ';' before '=' token 
expected unqualified-id before '=' token 

我嘗試了一些或多或少隨機語法,但他們沒有編制。

謝謝!

回答

3

您不能爲T別名。在委員會中討論了以下內容以製作T的別名(因爲很晚的C++ 11草案包含註釋,聲明它的T的別名,其中Defect Report已清除)。

// Courtesy of @KerrekSB 
template <template <typename> class T, typename R> class Unit 
{ 
    template <typename U> using MyTemplate = T<U>; 
    // ... 

    // use e.g. MyTemplate<int> to get T<int> 
}; 

注意,雖然MyTemplate<int>是同一類型T<int>,即MyTemplate一樣T。在http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1286的措辭應該改變這種情況,但在上次會議上它被認爲是一種非常特殊的機制,它並不真正適合什麼別名模板(自己的模板),並且它被推回審查。爲了達到這個效果,將來可以使用using MyTemplate = T;來滿足賬單(當然,如果提議和接受的話)。

4

由於T不是一種類型,所問的問題沒有意義。但是,您可以建立一個別名T,如:

template <template <typename> class T, typename R> class Unit 
{ 
    template <typename U> using MyTemplate = T<U>; 
    // ... 

    // use e.g. MyTemplate<int> to get T<int> 
}; 

前C++ 11你會需要更多的東西notationally參與所概述in this answer of mine(和使用,例如,標準庫的標準分配的rebind修理工。)

+0

謝謝,這正是我想要的。我會編輯這個問題才能使它有意義 – arnoo

相關問題