调用模板化类内的枚举类枚举器的正确语法是什么

What is the correct syntax to call a enum class enumerators that are inside a templatized class?

本文关键字:枚举 语法 是什么 调用      更新时间:2023-10-16

我不知道如何从模板化类访问枚举类枚举器,无论是作为返回值还是只是一个值。正如您在以下示例中看到的那样,我完全不知道。我已经用谷歌搜索了错误消息,但没有运气。

很高兴你指出我正确的语法。

首先,这些是错误:

$ g++ -Wall -std=c++11 -o main.out main.cpp

main.cpp:25:1:错误:在"C::Values"之前需要"typename",因为"C"是依赖范围

C::

值 C::Get((//<-- 此处出错... ^main.cpp:在函数 'int main((' 中:main.cpp:35:2:错误:"模板类 C"在没有模板参数的情况下使用

C::Values values;//<-- ...和这里

^

$

这是完整的示例,因此可以对其进行测试:

template<int Val>
class C
{
public:
    enum class Values{ one, two };
    C();
    Values Get();
private:
    int val;
};
template<int Val>
C<Val>::C() : val{ Val } {}
template<int Val>
C<Val>::Values C<Val>::Get() // <-- Error here ...
{
    return Values::one;
}
int main(void)
{
    C<5> aVariable;
    C::Values values; // <-- ... and here
    return 0;
}

提前谢谢你!!

你需要

帮助编译器告诉Value是类型名:

template<int Val>
typename C<Val>::Values C<Val>::Get() 

在第二种情况下,您还需要提供模板参数,例如 0

C<0>::Values values;

你可以阅读这个答案 官方,打字名有什么用? 以获得更多解释。

首先,您需要使用关键字 typename 作为依赖类型名称 C<Val>::Values ,例如

template<int Val>
typename C<Val>::Values C<Val>::Get()
~~~~~~~~

其次,你需要为类模板C指定模板参数,例如

C<5>::Values values;
 ~~~

并查看我必须在哪里以及为什么必须放置"模板"和"类型名称"关键字?