C++ 使用模板化类的成员结构

C++ 使用模板化类的成员结构,c++,c++11,c++17,C++,C++11,C++17,是否可以使用模板类的成员struct或enum class,而无需显式指定模板参数。例如: template<typename A, typename B> class Foo { public: enum class Status {E1, E2, E3}; }; void func() { auto e = Foo::Bar::E1; } 模板 福班{ 公众: 枚举类状态{E1,E2,E3}; }; void func(){ 自动e=Foo::Bar::E1; }

是否可以使用模板类的成员
struct
enum class
,而无需显式指定模板参数。例如:

template<typename A, typename B>
class Foo {
 public:
  enum class Status {E1, E2, E3};
};

void func() {
  auto e = Foo::Bar::E1;
}
模板
福班{
公众:
枚举类状态{E1,E2,E3};
};
void func(){
自动e=Foo::Bar::E1;
}

我想我明白了一点,编译器需要实例化
Foo
,给定它的模板参数,但只是想知道是否有办法仍然使用它的成员类。

如果类型不是很重要,而您只想访问enum类,那么您可以键入def它

using Bar = Foo<void, void>;

void func() {
  auto e = Bar::Status::E1;
}
使用Bar=Foo;
void func(){
自动e=Bar::Status::E1;
}

我认为您的另一个选择是显式编写类型或在命名空间范围中声明enum类

C++不允许在不传递模板参数的情况下使用模板类。但是,如果您的需求不限于两个模板参数,则有一个变通方法

解决办法: 您可以将类Foo定义为可变模板。这将使您能够在不向类Foo传递参数的情况下使用enum。示例如下:

template<typename ...A>
class Foo {
 public:
   using Bar = enum class Status {E1, E2, E3};
};

void func() {
  auto e = Foo<>::Bar::E1;
}
模板
福班{
公众:
使用Bar=enum类状态{E1,E2,E3};
};
void func(){
自动e=Foo::Bar::E1;
}

我不确定这是否会满足您的要求,但这将编译和工作。我确实是用c++17 flag编译的。

问得好,但恐怕是重复的。不,你不能那样做。C++不这样工作。事实是,<代码> fo::状态< /> >与 Fo::状态不相同。问题是为什么EnUM是模板类的成员类型,而不依赖于任何模板参数?实际上,类中没有任何东西依赖于模板参数,为什么类是一个模板参数?@slepic我只是添加了一个非常简单的示例来问这个问题。在我的实际代码中还有其他成员变量,它们依赖于它的模板参数。