可变参数模板模板参数

发布于 2024-12-25 09:17:01 字数 848 浏览 2 评论 0原文

以下代码无法使用 clang 3.0 进行编译,这是因为我做错了吗?因为它在 c++11 中不允许,或者因为它在 clang 中不支持?

template<int OFFSET>
struct A {
    enum O { offset = OFFSET };
};

template < template <int T> class Head, typename... Tail>
struct C : public Head<1>, private C<Tail> { };

int main()
{
    C< A, A > c1;

    return 0;
}

编译器错误:

test3.cxx:99:42: error: template argument for template template parameter must be a class template or type alias template
    struct C : public Head<1>, private C<Tail> { };
                                         ^
test3.cxx:103:15: error: use of class template A requires template arguments
        C< A, A > c1;
              ^
test3.cxx:94:12: note: template is declared here
    struct A {
           ^
2 errors generated.

The following code does not compiles using clang 3.0, is this because I have done it wrongly? Because it is not allowed in c++11 or because it is not supported in clang?

template<int OFFSET>
struct A {
    enum O { offset = OFFSET };
};

template < template <int T> class Head, typename... Tail>
struct C : public Head<1>, private C<Tail> { };

int main()
{
    C< A, A > c1;

    return 0;
}

Compiler error:

test3.cxx:99:42: error: template argument for template template parameter must be a class template or type alias template
    struct C : public Head<1>, private C<Tail> { };
                                         ^
test3.cxx:103:15: error: use of class template A requires template arguments
        C< A, A > c1;
              ^
test3.cxx:94:12: note: template is declared here
    struct A {
           ^
2 errors generated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

往昔成烟 2025-01-01 09:17:01

三个问题:

Tail 是模板的可变列表,而不是类型的列表。因此它应该是

template<int> class... Tail

而不是

typename... Tail

,并且您需要使用 private C 而不是 private C 显式扩展参数包。

Tail... 为空时,您需要实现基本情况:(

// base case
template < template <int> class Head>
struct C<Head> : public Head<1> { };

这是使用 Clang 3.0 进行编译的)

现在的整段代码:

template<int OFFSET>
struct A {
    enum O { offset = OFFSET };
};

template < template <int> class Head, template<int> class... Tail>
struct C : public Head<1>, private C<Tail...> { };
template < template <int> class Head>
struct C<Head> : public Head<1> { };

int main()
{
    C< A, A > c1;
    return 0;
}

Three issues:

Tail is to be a variadic list of templates, not of types. Hence it should be

template<int> class... Tail

instead of

typename... Tail

and you need to explicitly expand the parameter pack with private C<Tail...> instead of private C<Tail>.

And you'll need to implement the base case, for when Tail... is empty:

// base case
template < template <int> class Head>
struct C<Head> : public Head<1> { };

(This is compiling for with Clang 3.0)

The entire piece of code now:

template<int OFFSET>
struct A {
    enum O { offset = OFFSET };
};

template < template <int> class Head, template<int> class... Tail>
struct C : public Head<1>, private C<Tail...> { };
template < template <int> class Head>
struct C<Head> : public Head<1> { };

int main()
{
    C< A, A > c1;
    return 0;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文