繁体   English   中英

为什么在template类的枚举中使用声明不起作用?

[英]Why Doesn't This Using Declaration on a `template` Class's Enum Work?

这样编译:

template <typename T> class Parent { public:
  enum MyEnum { RED,GREEN,BLUE };
};
class Child : public Parent<int> { public:
  using Parent<int>::MyEnum;
  int foo() { return GREEN; }
};
void tester() { Child d; d.foo(); }

不会(在gcc上,这会输出error: 'GREEN' was not declared in this scope ):

template <typename T> class Parent { public:
  enum MyEnum { RED,GREEN,BLUE };
};
template <typename T> class Child : public Parent<T> { public:
  using Parent<T>::MyEnum;
  int foo() { return GREEN; }
};
void tester() { Child<int> d; d.foo(); }

我的问题:为什么? (还有任何解决方法的建议吗?)

对于第二个代码:

  1. 您需要添加typename关键字,因为您访问的类型MyEnum取决于T。将using的行更改为此:

using typename Parent<T>::MyEnum;

  1. 然后,在foo方法中,您需要指定GREEN是枚举MyEnum的成员,如下所示:

int foo() { return MyEnum::GREEN; }

用gcc和c ++用clang对我来说编译很好
这里的例子

它在第一个示例中有效,因为using行中的MyEnum不依赖于模板类型T。您显式使用了int类型的Parent。

线

using Parent<int>::MyEnum;

与能够在该行中使用GREEN没有关系

int foo() { return GREEN; }

您可以删除第一行,第二行应继续工作。

对于第二个示例,可以使用:

template <typename T> class Child : public Parent<T>
{
    public:
      using Parent<T>::GREEN;
      int foo() { return GREEN; }
};

我现在还不清楚为什么在Child不会自动提供Parent<T>::GREEN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM