c++ - 无法将返回的枚举与枚举进行比较
问题描述
我遇到了一个问题,我有一个名为 的枚举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')”
我已经搜索了一段时间,没有任何迹象表明这个问题。我该如何解决这个问题?
解决方案
您已定义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];
}
推荐阅读
- python - 将长 xticks 分成 2 行 matplotlib
- html - 具有边框半径的圆角仅影响一侧
- javascript - 使用jquery应用排序后如何对总行求和
- c# - FluentNHibernate:DateTime 的默认精度已更改?
- php - 如何在WordPress的前端输出附件帖子元
- angular - 在 Cordova DeviceReady 事件之后调用 Angular 模块导入
- webpack - 生产中 chrome 的源映射
- mysql - MySQL-使用复合索引键改进 count(*) 聚合
- oracle-apex - 如果验证通过,保存后刷新 IG
- javascript - 垂直可滚动图片库