我的以下代码有问题:
class SymmetryTypes
{
public:
enum Type { REAL, COMPLEX, INTEGER, PATTERN, UNINITIALIZED };
void f() { cout << "SymmetryTypes::f() invoked" << endl; };
};
template <class T>
class EnumBase : public T
{
public:
EnumBase() /* : t_(T::UNINITIALIZED) */ { T::f(); }
private:
// T::Type t_;
};
int main(int argc, char* argv[])
{
EnumBase<SymmetryTypes> symmetry;
return 0;
}
它可以编译,但是当我取消注释时它不会编译。看来我可以访问基类 T 的函数成员,但无法访问枚举成员及其值(也尝试过 typedef)。你知道为什么吗?
最佳答案
T::Type
旨在引用类型,因此您需要 typename
typename T::Type t_;
如果您省略 typename
,它会认为在解析模板时您正在声明一个名为 T::Type
的成员(然后在 >t_
因为后面不能有第二个名字)。请记住,此时它还不知道 T
是什么。更详细的解释can be found here 。
成员初始值设定项很好。编译器可能会对无效的成员声明感到困惑。
关于c++ - 从 C++ 中的模板参数继承时无法访问基类的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5133732/