我有一个模板类,如下所示:
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 ++功能。不幸的是,我不能在这个版本中使用枚举类。
答案 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中使用它。
幸运的是,decltype
已introduced 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;
}