模板类中没有名为 X 的类模板

发布于 2024-11-03 04:59:01 字数 375 浏览 6 评论 0 原文

当尝试使用 GCC 4.6.0 编译此(类似 CRTP 的)代码时:

template<template<class> class T> struct A;

template<class T> 
struct B: A<B<T>::template X> {
    template <class U> struct X { U mem; };
};

B<int> a;

我收到错误消息“test.cpp:3:26: error: no class template named 'X' in 'struct B'”。为什么 X 在类定义之外似乎是不可见的?

When tryin to compile this (CRTP-like) code with GCC 4.6.0:

template<template<class> class T> struct A;

template<class T> 
struct B: A<B<T>::template X> {
    template <class U> struct X { U mem; };
};

B<int> a;

I get the errormessage "test.cpp:3:26: error: no class template named ‘X’ in ‘struct B<int>’". Why does X seem to be invisible outside the class definition?

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

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

发布评论

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

评论(3

金兰素衣 2024-11-10 04:59:01

正如埃米尔·科米尔(Emile Cormier)此处正确指出问题是在A实例化的地方,B仍然是一个不完整的类型,并且你不能使用内部模板。

解决方案是将模板 X 移到模板 B 之外。如果它独立于模板B的特定实例化T,只需将其移动到命名空间级别,如果它依赖于实例化,则可以使用类型特征:

template <typename T>
struct inner_template 
{
   template <typename U> class tmpl { U mem; }; // can specialize for particular T's
};
template <typename T>
struct B : A< inner_template<T>::template tmpl >
{
};

As Emile Cormier correctly points out here the problem is that at the place of instantiation of A, B is still an incomplete type, and you cannot use the inner template.

The solution for that is moving the template X outside of the template B. If it is independent of the particular instantiation T of the template B, just move it to the namespace level, if it is dependent on the instantiation, you can use type traits:

template <typename T>
struct inner_template 
{
   template <typename U> class tmpl { U mem; }; // can specialize for particular T's
};
template <typename T>
struct B : A< inner_template<T>::template tmpl >
{
};
愿得七秒忆 2024-11-10 04:59:01

当您指定 A::template X> 作为基类时,struct B 仍被视为不完整类型。

struct B is still considered an incomplete type when you specify A<B<T>::template X> as the base class.

梦幻的味道 2024-11-10 04:59:01

您尝试使用 B 的成员作为 B 的父级来创建递归式情况。例如,这也不能编译:

template<template<class> class T> struct A {};

struct B : public A<B::nested>
{
        struct nested {};
};

You're trying to use a member of B as a parent of B creating a recursive-esque situation. For example this doesn't compile either:

template<template<class> class T> struct A {};

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