使用仿函数时,括号前的表达式必须具有 pointer-to- 函数类型
Expression preceding parentheses must have pointer-to- function type when using functors
因此,正如标题所述,我正在努力为我的游戏服务器地图使用仿函数 class。我定义了以下模板 class 来表示扇形 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_Map
(TSector
是一个包含 2 维 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 个这样的文件)并从 [=19= 中检索相应的扇区] 来存储解析的图块内容:
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 代码说:"expression preceding parentheses of apparent call must have (pointer-to-) function type"。
g++ 说:g_Map 不能用作函数。
g_Map
是指向 matrix3d
的 指针 。为了在那个 matrix3d
对象上调用你的 operator()
,你需要首先取消引用指针:
TSector* sector = (*g_Map)(x, y, z);
相当于:
TSector* sector = (*g_Map).operator()(x, y, z);
或者:
TSector* sector = g_Map->operator()(x, y, z);
因此,正如标题所述,我正在努力为我的游戏服务器地图使用仿函数 class。我定义了以下模板 class 来表示扇形 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_Map
(TSector
是一个包含 2 维 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 个这样的文件)并从 [=19= 中检索相应的扇区] 来存储解析的图块内容:
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 代码说:"expression preceding parentheses of apparent call must have (pointer-to-) function type"。 g++ 说:g_Map 不能用作函数。
g_Map
是指向 matrix3d
的 指针 。为了在那个 matrix3d
对象上调用你的 operator()
,你需要首先取消引用指针:
TSector* sector = (*g_Map)(x, y, z);
相当于:
TSector* sector = (*g_Map).operator()(x, y, z);
或者:
TSector* sector = g_Map->operator()(x, y, z);