我正在尝试使用template-template,这很有趣。我有以下类:
template<template<class> class T, typename R> class Unit
{
using FullType = T<R>;
using Ratio = R;
//using Type = T;
...
};我已经将类型R和T<R>定义为成员类型Ratio和FullType。是否可以将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我尝试了一些或多或少的随机语法,但都没有编译过。
谢谢!
发布于 2012-12-16 21:25:38
您不能为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 is 与T不同。http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1286的措辞应该改变这一点,但在上次会议上,它被认为是一个非常特殊的机制,并不真正适合原来的别名模板(自己的模板),并被推迟审查。为了达到这种效果,未来的using MyTemplate = T;可能会符合要求(当然,如果被提议并被接受)。
发布于 2012-12-16 05:48:26
因为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之前,您需要一些更具代表性的东西,如概述的in this answer of mine (例如,由标准分配器的rebind机制在标准库中使用)。
https://stackoverflow.com/questions/13896509
复制相似问题