我正在尝试使用模板模板来获得乐趣。我有以下课程:
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
我尝试了一些或多或少的随机语法,但都没有编译。
谢谢!
答案 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;
可以适合该法案(如果提议和接受,当然)。