C++ 在派生类中使用枚举的奇怪循环模式

C++ 在派生类中使用枚举的奇怪循环模式,c++,templates,enums,c++17,C++,Templates,Enums,C++17,当我编译此代码时(使用Visual Studio 2017): 模板 类基类 { 公众: typename MostDerived::Units DoStuff() { 大多数派生::单位; 返回单元; } }; 类派生类:公共基类 { 公众: 枚举类单位 { 第一单元 }; }; void Invoke() { DerivedClass DerivedClass; DerivedClass::Units=DerivedClass.DoStuff(); } 我得到一个错误: C2039:“单位

当我编译此代码时(使用Visual Studio 2017):

模板
类基类
{
公众:
typename MostDerived::Units DoStuff()
{
大多数派生::单位;
返回单元;
}
};
类派生类:公共基类
{
公众:
枚举类单位
{
第一单元
};
};
void Invoke()
{
DerivedClass DerivedClass;
DerivedClass::Units=DerivedClass.DoStuff();
}
我得到一个错误:

C2039:“单位”:不是“DerivedClass”的成员

通过实验,我确定当
DerivedClass::Units
用作
DoStuff()
的结果或参数时会发生错误(因此,在by引用变量中返回结果不会修复错误)。我可以在函数体中使用单位,没有错误


是与C++ 17一致的行为,还是VisualC++中的一个bug?

,可以使用自动返回类型演绎来修复它。在函数内部使用
Units
不是错误,因为
BaseClass
的实例化只会实例化声明,而不会实例化定义
DoStuff
body在实际调用时被实例化,此时
Units
不再是不完整的

auto DoStuff()
{
    typename MostDerived::Units units{};
    return units;
}

可能重复的问题我看不出这是与您链接的问题的重复。我的问题没有额外的模板参数,我看不到问题之间有任何有用的关联。为什么你认为它们是重复的(除了两者都指CRTP)?这两个问题都指不完整的类型。这两个问题都可以通过使用traits模式来解决。我可以看到traits可以在哪些方面解决这个问题,但我不想让外部接口变得更加混乱,因为它带来的好处相对较小(我正在尝试解决的共享代码很小)。我已经改变了这个问题,询问这是否与C++ 17一致。我可以在G++上得到一个类似的错误,所以它不太可能是一个bug。看起来你可能需要一个变通的办法来让这个游戏玩得更好。
auto DoStuff()
{
    typename MostDerived::Units units{};
    return units;
}