【发布时间】:2015-10-14 15:25:01
【问题描述】:
这样编译:
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(); }
我的问题:为什么?(另外,有什么解决方法的建议吗?)
【问题讨论】:
-
两阶段名称查找。
GREEN不是从属名称,在Child<int>和Parent<int>实例化之前,在foo的定义点进行查找。要使其成为依赖名称(从而将查找推迟到实例化点),您必须编写Child::GREEN或Parent::GREEN或this->GREEN。 -
(c++11)
enum class在这里可能很有用,以避免常规枚举在封闭范围内自动公开常量的行为,这在这种情况下会引起很多混乱。 . -
@IgorTandetnik
int foo(Parent<T>::MyEnum e) { return e; }之类的呢? -
怎么样?我不确定我是否理解这个问题。