gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:49 24 4
gpt4 key购买 nike

当我编译此代码时(使用 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: 'Units': is not a member of 'DerivedClass'.

通过试验,我确定错误发生在 DerivedClass::Units 被用作 DoStuff() 的结果或参数时(因此返回引用变量的结果不能修复错误)。我可以在函数体中使用 Units 而不会出错。

此行为与 C++ 17 一致还是 Visual C++ 中的错误?

最佳答案

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

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

online compiler

关于c++ - 在派生类中使用枚举的奇怪重复模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47501159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com