C++ C++;-使用decltype和模板类中包含的枚举

C++ C++;-使用decltype和模板类中包含的枚举,c++,enums,typedef,decltype,C++,Enums,Typedef,Decltype,我有一个模板类,如下所示: template <typename T> class Foo { public: enum Mode { Mode1, Mode2, Mode3 }; // ... }; 但在我看来,编译器应该能够从实际的实例变量派生类型。这样的话: Foo<float> foo; // ... typedef decltype(foo) FooType; auto m = FooType::Mode1; 这将导致编译器错误“Expected”(

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

template <typename T>
class Foo {
public:
  enum Mode { Mode1, Mode2, Mode3 };
  // ...
};
但在我看来,编译器应该能够从实际的实例变量派生类型。这样的话:

Foo<float> foo;
// ...
typedef decltype(foo) FooType;
auto m = FooType::Mode1;
这将导致编译器错误“Expected”(“对于函数样式转换或类型构造”)

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


我使用CLAN 3,我不能使用-STD= C++ 11,所以我只使用CLAN 3中的默认C++特性。不幸的是,我不能在这个版本中使用EnUM类。

< P>这是用G+4.4.2.2

来为我工作的。

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

int main()
{
   Foo<float> foo;
   auto m = decltype(foo)::Mode1;
}
模板
福班{
公众:
枚举模式{Mode1,Mode2,Mode3};
};
int main()
{
富富,;
自动m=decltype(foo)::Mode1;
}

附加的
typename
就是问题所在。

您正在使用的是
decltype
,这是一个已经存在的功能,因此无法在C++03中使用它

幸运的是,
decltype
已经(就像
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;
}
模板
福班{
公众:
枚举模式{Mode1,Mode2,Mode3};
// ...
};
int main(){
富富,;
// ...
自动m=decltype(foo)::Mode1;
}

<代码> > DECKECTON/COD>是使用C++ > 11代码,使用“<代码> Auto/<代码> > @ GHODOFStand ADSP>是的,我可以访问CLAN 3中的默认C++特性,其中包括一些C++ 11个特性,如代码>自动<代码>和<代码> DeCype 。我不能打开代码< > STD= C++ 11 <代码>,因为这是自定义的第三方CLAN构建。这个选项被禁用了。这看起来很混乱。在我看来,它应该默认为C++11,拥有编译器的所有功能,或者默认为没有C++11功能的旧标准,除非你有这个选项。实际上,我收到了相同的错误消息,无论是否有
typename
,所以我把它留在了里面,因为我不确定如果有必要的话。C++03是Clang 3.0的默认方言吗?那么问题可能是部分支持
decltype
?考虑到该关键字已被识别并且在两行版本中有效,它在一行版本中的使用似乎不受支持-假设
decltype
“返回”此版本编译器中的类型(否则
decltype(foo)::Mode1
可以工作)?
auto m = typename decltype(foo)::Mode1;
template <typename T>
class Foo {
public:
  enum Mode { Mode1, Mode2, Mode3 };
};

int main()
{
   Foo<float> foo;
   auto m = decltype(foo)::Mode1;
}
template <typename T>
class Foo {
public:
  enum Mode { Mode1, Mode2, Mode3 };
  // ...
};


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