1

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

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

    ...
};

我已将 typeR和定义T<R>为成员类型RatioFullType. 是否可以别名TType

上面的注释行在 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

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

谢谢 !

4

2 回答 2

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 之前,您需要更多的符号,如我的这个答案中所述(例如,标准分配器的rebind机械师在标准库中使用。)

于 2012-12-15T21:48:26.273 回答
3

您不能为T. 委员会讨论了以下内容以创建别名T(因为非常晚的 C++11 草案包含说明它是缺陷报告清理的别名)。T

// 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>
};

注意 whileMyTemplate<int>与 的类型相同T<int>MyTemplate即与不同Thttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1286上的措辞本应改变这一点,但在上次会议上,它被认为是一种非常特殊的机制,不会' 真的不适合原来的别名模板(自己的模板),它被推回审查。为了达到这种效果,using MyTemplate = T;未来可能会符合要求(当然,如果提出并接受)。

于 2012-12-16T13:25:38.237 回答