C++ &引用;使用类模板需要模板参数列表“;错误,即使使用了模板的模板,也应使用模板类 背景/最终愿望(尽管与问题无关)

C++ &引用;使用类模板需要模板参数列表“;错误,即使使用了模板的模板,也应使用模板类 背景/最终愿望(尽管与问题无关),c++,templates,metaprogramming,C++,Templates,Metaprogramming,为大量元素类型的大量容器的大量大小做一个基准测试 至少我希望有一个类型列表的模板组合器来创建foreach(foreach)方案。(从两个4元素列表中获取16元素列表。) 我没有boost mpl,也没有C++11。:'( 我首先尝试创建一个配对列表,列表1的第一个元素在新列表中重复,其中第二个元素是列表2元素的副本。 这将是第一步。(最终目标是获得list1大小的列表,由包含所有组合的成对列表组成。) 总之,我遇到了一个小的实际问题,我有一个转换元函数,它只接受一个带有1个模板参数的谓词作为转

为大量元素类型的大量容器的大量大小做一个基准测试

至少我希望有一个类型列表的模板组合器来创建foreach(foreach)方案。(从两个4元素列表中获取16元素列表。)

我没有boost mpl,也没有C++11。:'(

我首先尝试创建一个配对列表,列表1的第一个元素在新列表中重复,其中第二个元素是列表2元素的副本。 这将是第一步。(最终目标是获得list1大小的列表,由包含所有组合的成对列表组成。)

总之,我遇到了一个小的实际问题,我有一个转换元函数,它只接受一个带有1个模板参数的谓词作为转换器函数

但我希望创建一个从2参数元函数到一个接受1参数但在typedefing期间存储了第一个参数的元函数的闭包

我做到了:

template < template <class> class Principal, typename TypeListN_T >
struct Transform
{
    typedef typename detail::TransformAux<Principal, TypeListN_T, EmptyT, Length<TypeListN_T>::value - 1 >::Value_t Value_t;
};


template < typename T1, typename T2 >
struct Pair
{
    typedef T1 First_t;
    typedef T2 Second_t;
};

template < typename T1, typename T2 >
struct MakePair
{
    typedef Pair< T1, T2 > Value_t;
};

template < template < class, class > class Binary, typename T >
struct Unarify
{
    template < typename T2 >
    struct U
    {
        typedef Binary< T, T2 > value_t;
    };
};

// create a list of " Pair<Tfirst, List::At< i > > " for each i in List.
template < typename TFirst, typename List >
struct EmplaceListInSecond
{
    typedef typename List::Head_t ToPlaceRightT;
    typedef TFirst                ToPlaceLeftT;

    template < typename T >
    struct UnaryPairMaker : Unarify< MakePair, ToPlaceLeftT >::U
    {
    };

    typedef typename Transform< UnaryPairMaker, List >::Value_t Value_t;
};

我们可以这样做,这是可能的!人,是的,有可能把一个类型从二进制元函数关闭成一元函数,它可以用元函数作为元函数,而HEH. C++只是奇石。< /P> < P> u需要一个参数(参见它的声明)

模板
结构单元
{
你不能在队伍中传球

template < typename T >
    struct UnaryPairMaker : Unarify< MakePair, ToPlaceLeftT >::U
模板
结构UnaryPairMaker:Unarify::U
一种可能的解决办法:

template < typename T >
    struct UnaryPairMaker : Unarify< MakePair, ToPlaceLeftT >::template U<T>
    {
    };
模板
结构UnaryPairMaker:Unarify::模板U
{
};
还要注意模板关键字:如果编译器遵循标准,则该关键字不是可选的

当成员模板专用化的名称出现在后面时。或 ->在后缀表达式中,或在限定id中嵌套名称说明符之后,以及后缀表达式或限定id显式 取决于模板参数(14.6.2),即成员模板名称 必须以关键字模板作为前缀。否则名称为 假定为非模板命名


U
是一个模板:
templatestruct U
。收到的特定错误消息将很难让这一事实变得更清楚。
Unarify::U
作为基类,它需要一些东西来抓住
U
作为它的模板参数。我想你的意思是这样的
Unarify::U
,但我必须再盯着你的代码一段时间才能确定。同意上面的说法,问题在于
模板结构UnaryPairMaker:Unarify::U
行,U没有T2parameter@WhozCraig:没错!现在它的
语法错误了:missing,,'before'放在一边:
Unarify
看起来很像。@n.m:好吧,我称之为闭包,但咖喱显然更为具体,事实上它看起来就是这样。这是对的,多亏了我想出的WhozCraig。编译器现在对这一行很满意。尽管接下来我还有很多其他的sheisse,哈哈@v、 oddou仅供参考:我没有抄袭他的答案,但他确实应该获得第一名的荣誉!:)好的,我已经编译好了。这太棒了,感谢你们。我几乎不敢相信这个疯狂的结束想法真的奏效了,这让我很高兴!:)
template < typename T2 >
    struct U
    {
template < typename T >
    struct UnaryPairMaker : Unarify< MakePair, ToPlaceLeftT >::U
template < typename T >
    struct UnaryPairMaker : Unarify< MakePair, ToPlaceLeftT >::template U<T>
    {
    };