c++ - 调用模板化类中的枚举类枚举器的正确语法是什么?

标签 c++ class templates

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

很高兴您能指出正确的语法。

首先这些是错误:

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

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

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

C::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;

您可以阅读 Officially, what is typename for? 的这个答案以获得更多解释。

关于c++ - 调用模板化类中的枚举类枚举器的正确语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49374765/

相关文章:

c++ - 为什么当我再次尝试启动同一个线程时应用程序会崩溃?

java - 分配给在没有实例化对象的方法中声明的类变量

java - 在 Java 中读取和写入控制台

c++ - 对象数组的选择排序

templates - 无逻辑模板(例如 mustache )有什么优点?

c++ - 是否需要销毁移出的对象?

C++ - 控制串行端口 - 代码无法编译

c++ - 为什么我的代码不能在 C++ 中反转字符串?

c++ - 让函数在不指定模板参数的情况下获取指向模板对象的指针

javascript - 在 PHP 中检测移动设备