编译此代码时(使用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 ++中的错误?
答案 0 :(得分:4)
您可以使用自动返回类型扣除来修复它。在函数内部使用Units
不是错误,因为BaseClass<DerivedClass>
的实例化只会实例化声明,而不是定义。 DoStuff
实体在实际调用时会被实例化,此时Units
不再完整。
auto DoStuff()
{
typename MostDerived::Units units{};
return units;
}