在派生类中使用枚举的奇怪重复模式

时间:2017-11-26 21:22:54

标签: c++ templates enums c++17

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

template<class MostDerived>
class BaseClass
{
public:
    typename MostDerived::Units DoStuff()
    {
        MostDerived::Units units;

        return units;
    }
};

class DerivedClass : public BaseClass<DerivedClass>
{
public:
    enum class Units
    {
        Unit1
    };
};

void Invoke()
{
    DerivedClass derivedClass;
    DerivedClass::Units units = derivedClass.DoStuff();
}

我收到错误:

  

C2039:'单位':不是'DerivedClass'的成员。

尝试使用它,我已经确定当DerivedClass::Units用作结果或DoStuff()的参数时发生错误(因此将结果返回到引用变量中不会修复错误)。我可以在函数体中使用单位而没有错误。

这种行为是否与C ++ 17一致,还是Visual C ++中的错误?

1 个答案:

答案 0 :(得分:4)

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

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

online compiler