[英]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(); }
我的问题:为什么? (还有任何解决方法的建议吗?)
对于第二个代码:
using typename Parent<T>::MyEnum;
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.