首页 > 解决方案 > 无法将返回的枚举与枚举进行比较

问题描述

我遇到了一个问题,我有一个名为 的枚举tile,一个调用的函数tileread返回一个tile值,以及一个if将返回的值与静态值进行比较的语句,也是tile

enum tile{ tile_void, tile_flat };

tile tileread( const int x, const int y ) {
    if( x < 0 || x >= level_length || y < 0 || y >= level_width ) {
        return tile_void;
    }
    return level_tile[x][y];
}

if( tileread[ aux_int_1 ][ aux_int_2 ] == tile_void ) {
    player_vel[2] -= player_grav;
}

但是,编译器会抛出一个错误,提示“'operator=' 不匹配(操作数类型是 'tile(int, int)' 和 'tile')”

我已经搜索了一段时间,没有任何迹象表明这个问题。我该如何解决这个问题?

标签: c++enums

解决方案


您已定义tileread为一个函数。和

tileread[ aux_int_1 ][ aux_int_2 ]

是(通常)访问数组数组(或指针数组或指向指针的指针)中的元素的语法,而不是用于调用函数的语法。你需要:

if ( tileread( aux_int_1, aux_int_2 ) == tile_void ) {

然后它应该工作。

现在,如果您真的想像使用数组数组一样使用方括号tileread,您可以使用运算符重载来设置它。运算符重载的第一步是考虑是否真的应该使用运算符重载。特殊语法对您要解决的问题有多大意义?它对使用你的界面的程序员更有用,还是对遇到它的程序员更困惑?(即使你从不打算分享你的代码,那个程序员也可以是你,在你把项目搁置一旁,然后在几个月或几年后回来。)

如果您认为值得,定义tileread允许的名称tileread[ aux_int_1 ][ aux_int_2 ]可能如下所示:

class TileReadType {
public:
    constexpr TileReadType() noexcept = default;
private:
    class RowProxy {
    public:
        tile operator[] ( int y ) const;
    private:
        constexpr explicit RowProxy( int x ) noexcept : x(x) {}
        int x;
        friend TileReadType;
    };
public:
    constexpr RowProxy operator[] ( int x ) const noexcept
    { return RowProxy(x); }
};
constexpr TileReadType tileread{};

// Either mark "inline", or put in a source file:
tile TileReadType::RowProxy::operator[] ( int y ) const
{
    // Code that was in the function goes here:
    if( x < 0 || x >= level_length || y < 0 || y >= level_width ) {
        return tile_void;
    }
    return level_tile[x][y];
}

推荐阅读