【问题标题】:passing enum in constructor as an argument将构造函数中的枚举作为参数传递
【发布时间】:2013-10-29 06:56:29
【问题描述】:

枚举在全局范围内声明如下,PSLGVertex::PSLGVertex() 构造函数抱怨最后一个参数“PSLGVertexType”不是类或命名空间”

我在这里做错了什么?

enum PSLGVertexType {
REFLEX_VERTEX,
CONVEX_VERTEX,
MOVING_STEINER_VERTEX,
MULTI_STEINER_VERTEX,
RESTING_STEINER_VERTEX,
OTHER_VERTEX
};

构造函数

PSLGVertex::PSLGVertex() : mark(false), oriPosition(0, 0), speed(0, 0), 
startTime(0.0),firstin(NULL), firstout(NULL),type(PSLGVertexType::OTHER_VERTEX)

【问题讨论】:

    标签: c++ enums arguments


    【解决方案1】:

    您正在使用PSLGVertexType::,它告诉编译器PSLGVertexType 是类/结构或命名空间,但两者都不是。

    使用普通的OTHER_VERTEX

    【讨论】:

    • 是的,我也试过这个,但编译器抱怨“类'PSLGVertex'没有任何名为'OTHER_VERTEX'的字段”我真的不明白为什么编译器会在类定义中查找enum 实际上是在头文件的全局范围内定义的,而不是在类体中。是不是很奇怪?
    • 这并不奇怪,因为类名是当前最内层的作用域,所以这是编译器首先查看的地方,然后逐渐“剥离”封闭的作用域。无论如何,你说枚举在全局命名空间中,那么如果你说::OTHER_VERTEX 会发生什么?
    • 又是一个错误,它通常会导致编译器在这些事件中出现一些难以理解的错误,最好相信直觉而不是编译器输出。顺便说一句,我注意到这种类型(PSLGVertexType::OTHER_VERTEX)是“类型”变量,它是在类公共部分中声明的 PSLGVErtexType,我认为它是关键字或某些类型转换,但实际上不是。 AFAIU 在构造函数中它不调用任何函数,而是使用该表达式初始化类中的一些属性。那么问题就变成了如何为局部变量分配一个枚举?试过类型=PSLGVertexType::OTHER_VERTEX
    • 试过类型 =PSLGVertexType::OTHER_VERTEX 没有成功:((抱怨的错误是:“错误:预期的'('在'='令牌之前”
    • @SonyaBlade:您似乎不了解枚举的工作原理或 C++ 的类型系统。您写了“这种​​类型(PSLGVertexType::OTHER_VERTEX)”,这没有任何意义。 PSLGVertexType 是一个类型,但 OTHER_VERTEX 是一个值。
    【解决方案2】:

    在 C++-03 中,enum 成员被放置在封闭范围内。所以不要说

     PSLGVertexType::OTHER_VERTEX
    

    只是

     OTHER_VERTEX
    

    在 C++11 中,您的代码会很好,因为成员被放置在封闭范围(为了向后兼容)和内部枚举范围中。

    C++11 还具有新的作用域枚举,您可以阅读有关 on Wikipedia 的信息。

    【讨论】:

    • 请检查我之前的回答,它再次引发了我在 QtCReator 中使用 MinGW 和 GCC 4.4 的错误。
    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2015-03-14
    • 2012-10-29
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多