是否可以为模板模板参数定义别名?

时间:2012-12-15 21:44:49

标签: c++ templates c++11 template-templates

我正在尝试使用模板模板来获得乐趣。我有以下课程:

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

我尝试了一些或多或少的随机语法,但都没有编译。

谢谢!

2 个答案:

答案 0 :(得分: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>
};

Pre-C ++ 11你需要一些更符合标记的内容in this answer of mine(并且例如,标准分配器的rebind机制在标准库中使用。)

答案 1 :(得分:3)

您无法为T创建别名。委员会讨论了以下内容,为T制作别名(因为很晚的C ++ 11草案包含说明 T的别名的注释a 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;可以适合该法案(如果提议和接受,当然)。