我有一个看起来像这样的模板类:
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++ 功能。不幸的是我不能在这个版本中使用枚举类。
最佳答案
这对我有用,使用 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
是问题所在。
关于C++ - 将 decltype 与包含在模板类中的枚举一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24254310/