使用函子时,括号前的表达式必须具有指向函数的指针

时间:2019-07-16 00:52:41

标签: c++ object functor

因此,正如标题所述,我正在为我的游戏服务器地图类使用仿函数。我定义了以下模板类来代表扇形3D地图:

template <typename T>
class matrix3d {
public:
    matrix3d(uint16_t XMin, uint16_t XMax, uint16_t YMin, uint16_t YMax, uint8_t ZMin, uint8_t ZMax);

    T* operator() (uint16_t x, uint16_t y, uint8_t z);

private:
    uint16_t xmin, xmax;
    uint16_t ymin, ymax;
    uint8_t zmin, zmax;

    int16_t dx, dy;
    int8_t dz;

    T* Entry; // This is an array that I new() in the class constructor.
};

在服务器启动时,我new拥有一个全局实例,该实例将保存映射matrix3d<TSector *> *g_MapTSector是一个包含二维32x32瓦片及其标志的二维数组的结构,东西)。

我决定重载()运算符,以从地图文件中获得相应的坐标来检索TSector *:

template<typename T>
T* matrix3d<T>::operator() (uint16_t x, uint16_t y, uint8_t z) {
    uint16_t xx = x - xmin;
    uint16_t yy = y - ymin;
    uint8_t zz = z - zmin;

    if (xx >= 0 && xx < dx
     && yy >= 0 && yy < dy
     && zz >= 0 && zz < dz)
        return &Entry[xx + dy * dx * zz + dx * yy];

    error("matrix3d::operate: Unexpected Index %d/%d/%d.\n", x, y, z);
    return Entry;

}

因此,我的问题在于编译此函数时:LoadSector(filename, x, y, z),该函数针对每个扇区文件(我大约有10.000个文件)被调用,并从g_Map到存储已解析的切片内容:

void LoadSector(const char* FileName, uint16_t x, uint16_t y, uint8_t z) {
    TSector* sector = g_Map(x, y, z); // My actual problems is here.

    // BEGIN PARSING.
}

VS代码说:“明显调用的括号前的表达式必须具有(指针到)函数类型”。 g ++说:g_Map不能用作函数。

1 个答案:

答案 0 :(得分:1)

g_Map是指向matrix3d指针。为了在该operator()对象上调用matrix3d,您需要首先取消引用指针:

TSector* sector = (*g_Map)(x, y, z);

等同于:

TSector* sector = (*g_Map).operator()(x, y, z);

或者:

TSector* sector = g_Map->operator()(x, y, z);