我想要的是类似std :: bind的函数,但需要模板。 假设我有一个模板,该模板需要带有一组定义的参数的模板。 现在,我有了另一个可以使用的模板,但是它具有更多的参数,因此我需要将此复杂的模板转换为带有绑定参数的更简单的模板。
为此,我创建了一个定义别名模板的模板。
如果我将此绑定模板与具体类型一起使用,则效果很好。但是,如果我使用另一个模板参数实例化绑定模板,则gcc和clang假定别名不是模板模板。我知道它成为一个从属名称,但是没有像模板的typename
消歧器那样的东西。
使用icc和msvc可以正常工作。
template<
template<typename> typename Template
>
class ATypeWhichNeedsATemplateTemplate
{
};
template<typename A, typename B>
class AComplexTemplate
{
};
template<
template<typename...> typename ATemplate
,typename... Args
>
class Binder {
public:
template<typename T>
using type = ATemplate<T, Args...>;
};
template<typename T>
class AClassWithBoundTemplate : public ATypeWhichNeedsATemplateTemplate<
Binder<AComplexTemplate, T>::type
>
{
};
c声抱怨:
<source>:30:5: error: template argument for template template parameter must be a class template or type alias template
Binder<AComplexTemplate, T>::type
^
gcc说了类似的话:
<source>:31:1: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class> class Template> class ATypeWhichNeedsATemplateTemplate'
>
^
<source>:31:1: note: expected a class template, got 'Binder<AComplexTemplate, T>::type'
答案 0 :(得分:3)
type
是从属模板名称。您需要像Binder<AComplexTemplate, T>::template type
这样拼写,即e。:
template<typename T>
class AClassWithBoundTemplate : public ATypeWhichNeedsATemplateTemplate<
Binder<AComplexTemplate, T>::template type
>
{
};
固定的锚栓示例:https://godbolt.org/z/7nJtAU