明显调用的表达式前的括号必须具有(指针)函数类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了明显调用的表达式前的括号必须具有(指针)函数类型相关的知识,希望对你有一定的参考价值。

#include<iostream>
using namespace std;
#include<cmath>
struct point
double x;
double y;
;
class Quad
public:
Quad( int t1,int t2 )
a.x=t1;
a.y=t2;

point a;
;
double d( point &a,point &b )
return sqrt( pow( (a.x-b.x),2) - pow( a.y-b.y,2 ) );
int main()
double a,b,c,d,e,f,g,h;
while( cin>>a>>b>>c>>d>>e>>f>>g>>h )
Quad p1( a,b );
Quad p2( c,d );
Quad p3( e,f );
Quad p4( g,h );
cout<<fabs( d(p1.a,p2.a)-d(p3.a,p4.a) )<<endl;



错在哪?

没试过,但你想一下调用一个类的局部函数的形式应该是 (对象).(函数)()的形式,而你的funcList调用 明显缺少对象.
试了一下简单的例子,可运行成功.
class A

public:
bool B() return true;
bool C() return false;
;

void main(int argc, char ** argv)

A a;
bool (A::*funTest[2])() = A::B, A::C, d[2];
d[0] = (a.*funTest[0])();
d[1] = (a.*funTest[1])();

打字不易,如满意,望采纳。
参考技术A #include<iostream>
using namespace std;
#include<cmath>
struct point
  double x;
   double y;
;
class Quad
   public:
      Quad( int t1,int t2 )
  a.x=t1;
   a.y=t2;
 
 point a;
;
// 函数名为d跟main里面的d同名,不可见。可改为dd
double d( point &a,point &b )
 return sqrt( pow( (a.x-b.x),2) - pow( a.y-b.y,2 ) ); 
int main()
  double a,b,c,d,e,f,g,h; // 变量d跟函数d同名。请改其中之一
   while( cin>>a>>b>>c>>d>>e>>f>>g>>h )
     Quad p1( a,b );
      Quad p2( c,d );
 Quad p3( e,f );
 Quad p4( g,h );
 cout<<fabs( d(p1.a,p2.a)-d(p3.a,p4.a) )<<endl;
   

使用仿函数时,括号前的表达式必须具有指向函数的类型

【中文标题】使用仿函数时,括号前的表达式必须具有指向函数的类型【英文标题】:Expression preceding parentheses must have pointer-to- function type when using functors 【发布时间】:2019-07-16 00:52:41 【问题描述】:

因此,正如标题所述,我正在努力为我的游戏服务器地图类使用仿函数。我定义了以下模板类来表示扇形 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&lt;TSector *&gt; *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 Code 说:“明显调用括号前的表达式必须具有(指向)函数类型”。 g++ 说:g_Map 不能用作函数。

【问题讨论】:

与您的问题无关,但您可以通过使用 Entry 的容器类而不是原始指针和手动内存管理来让自己的生活更轻松。 【参考方案1】:

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);

【讨论】:

我将函数重写了 3 次,而这只是一个小错误。谢谢,这就像一个魅力。

以上是关于明显调用的表达式前的括号必须具有(指针)函数类型的主要内容,如果未能解决你的问题,请参考以下文章

opencv动态目标检测,出现明显调用表达式前的括号必须具有(指针)函数类型的问题

明显调用括号前的表达式必须具有(指向)函数类型

类中函数指针调用函数

使用仿函数时,括号前的表达式必须具有指向函数的类型

在 CUDA 中使用 clock() 函数

JavaScript 中怎么不带括号的调用函数