2012-12-15 51 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

相关问题