表达不会使用另一类的常数评估为常数

expression did not evaluate to a constant - using constant from another class

本文关键字:常数 一类 评估      更新时间:2023-10-16

[我的代码很安静,所以我只粘贴了似乎与我相关的部分,只需告诉我您是否需要查看更多,谢谢]

我在类(动画)中定义了一个常数,但现在我将类分为两个(AnimationsDefinition& AnimationSincance),我无法将该常数从一个类中使用到另一个类

我在AnimationsInstance.H

之前包括AnimationsDefinition.h

common.h

#include "animationsDefinition.h"
#include "animationsInstance.h"

编译器抱怨无法评估常数

以下代码曾经工作,但是现在我在另一类中使用它,它不再起作用

我遇到的错误:

error C2131: expression did not evaluate to a constant
note: failure was caused by non-constant arguments or reference to a non-constant symbol
note: see usage of 'EAST'

AnimationsDefinition.cpp

#include "common.h"
const int AnimationsDefinition::WEST    = 0;
const int AnimationsDefinition::SOUTH   = 1;
const int AnimationsDefinition::NORTH   = 2;
const int AnimationsDefinition::EAST    = 3;
...

AnimationsDefinition.h

#pragma once
class AnimationsDefinition
{
public:
    static const int WEST;
    static const int SOUTH;
    static const int NORTH;
    static const int EAST;
    ...

AnimationsInstance.cpp

#include "common.h"
void AnimationsInstance::update(float tpf)
{
    switch (direction)
    {
        case AnimationsDefinition::EAST: <<<<<<<<< compilation error
        {
            ...

任何帮助

问候

您可以在类本身中初始化static const变量。

class AnimationsDefinition
{
public:
    static const int WEST = 0;
    static const int SOUTH = 1;
    static const int NORTH = 2;
    static const int EAST = 3;
};

但是,如果您想避免违反ODR,则需要正确定义它们。

因此,请使用constexpr指示符,这意味着static数据成员的inline。可以在类定义本身中定义inline static数据成员。

class AnimationsDefinition
{
public:
    static constexpr int WEST = 0;
    static constexpr int SOUTH = 1;
    static constexpr int NORTH = 2;
    static constexpr int EAST = 3;
};

根据[class.static.data]/3:

可以在类别定义中定义内联静态数据成员,并可以指定括号或平等启用器。

const变量只有在遇到其初始分散器后才可以用作常数。在这种情况下,可以通过将初始评估器移动到标题中来实现。

请注意,将初始化器移至标题类别中的类别中的声明中,并不能使声明变成变量的定义。这些定义仍然必须保留在源文件中,而没有初始评估器。

好吧,我发现我可以在班级本身中定义这些,因为它们是静态的

您只有在将其声明inline


但是,对于开关案例,使用(范围)枚举更常规。