C ++ - 使用包含在模板化类中的枚举的decltype

时间:2014-06-17 01:01:14

标签: c++ enums typedef decltype

我有一个模板类,如下所示:

template <typename T>
class Foo {
public:
  enum Mode { Mode1, Mode2, Mode3 };
  // ...
};

我实例化了这个:

Foo<float> foo;
// ...
auto m = Foo<float>::Mode1;

但在我看来,在实例化Foo模板时包含对我所用类型的源依赖包含了不必要的冗余。经典的解决方案是整个类型的typedef

typedef Foo<float> FooType;
FooType foo;
// ...
auto m = FooType::Mode1;

但在我看来,编译器应该能够从实际的实例变量中派生出类型。所以就这样:

Foo<float> foo;
// ...
typedef decltype(foo) FooType;
auto m = FooType::Mode1;

这个编译。令我困惑的是为什么我不能将最后一部分作为单个表达式来完成:

auto m = typename decltype(foo)::Mode1;

这会导致编译器错误“Expected”('for function-style cast or type construction“。

我之所以想要这样做是因为我有比T更多的模板参数,而顶级typedef可能是最明智的解决方案我想知道为什么我的使用单行上的decltype不起作用。

我正在使用Clang 3.0而且我无法使用-std = c ++ 11所以我只使用了Clang 3.0中的默认C ++功能。不幸的是,我不能在这个版本中使用枚举类。

2 个答案:

答案 0 :(得分:0)

这适用于我,使用g ++ 4.8.2。

template <typename T>
class Foo {
public:
  enum Mode { Mode1, Mode2, Mode3 };
};

int main()
{
   Foo<float> foo;
   auto m = decltype(foo)::Mode1;
}

额外的typename是问题所在。

答案 1 :(得分:0)

您正在使用decltype,这是一项introduced in C++11的功能,因此无法在C ++ 03中使用它。

幸运的是,decltypeintroduced in Clang 2.9(就像auto一样)并且可以-std=c++11-std=c++0x使用。

您的代码使用C ++ 11编译得很好:

template <typename T>
class Foo {
public:
  enum Mode { Mode1, Mode2, Mode3 };
  // ...
};


int main() {
    Foo<float> foo;
    // ...
    auto m = decltype(foo)::Mode1;
}

Live demo