gpt4 book ai didi

C++模板中函数指针的c++错误C2064

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:47 25 4
gpt4 key购买 nike

如果我编译下面的代码,我会得到一个

"Error C2064: term does not evaluate to a function taking 2 arguments"

doOpp() 方法中。如果我将 q = f(p, i); 更改为 q = add(p, i); 一切都可以正常编译(使用 add()doOpp() 方法中的第二个参数)。我尝试了几种解决方案,但似乎没有任何效果。

template <class T = double>
class Points {
public:
Points(void);
Points(Point3d<T> *, int);
Points(T *, int);
Points(Points &);
~Points(void);

void clear();
int size();
void push_back(Point3d<T> &);
typename vector<Point3d<T>>::iterator begin(void){return pnts.begin();};
typename vector<Point3d<T>>::iterator end(void){return pnts.end();};

void assign(Point3d<T> *, int);
void assign(T *, int);
void assign(Points &);

Points valid(void);
Points valid(int *);
bool setValid(int, bool);
int validSize();

// Pointer to operator function prototype
typedef Point3d<T> (__thiscall Points<T>::*oppFunc) (Points<T> &, int);

Points operator=(Points &);

// + Operator method
Points operator+(Points &p){return doOpp(p, &Points<T>::add);};
Points operator-(Points &){return doOpp(p, &Points<T>::sub);};
Points operator*(Points &){return doOpp(p, &Points<T>::mlt);};;

private:

Points(int);
void assign(int);
int assign(Points &, Points &);
vector<Point3d<T>> pnts;
bool isSameSize(Points<T> &, char *);

// General purpose operator function
Points doOpp(Points<T> &, oppFunc);

// Addition method called by doOpp
Point3d<T> add(Points &p, int i) {return pnts[i] + p.pnts[i];}
Point3d<T> sub(Points &p, int i) {return pnts[i] - p.pnts[i];}
Point3d<T> mlt(Points &p, int i) {return pnts[i] * p.pnts[i];}
};

template <class T> int
Points<T>::assign(Points &p1, Points &p2) {
int s = min(p1.size(), p2.size());
assign(s);

return s;
}

template <class T> bool
Points<T>::isSameSize(Points &p, char *s) {
bool same = (pnts.size() == p.pnts.size());

#ifndef POINTS_NO_THROW
if (!same) {
PointsException e;
e.setMessage((string) s + " source sizes not equal");
throw e;
}
#endif

return same;
}

template <class T> Points<T>
Points<T>::doOpp(Points &p, oppFunc f) {
isSameSize(p, __FUNCTION__);
Points<T> r;
int s = r.assign(*this, p);
Point3d<T> q;

for (int i = 0; i < s; i++) {
q = f(p, i); // Causes error C2064 but q = add(p, i); works fine
}

return r;
}


int
main () {
Points<> p, q;

q.assign(a, 4);
p = q + q;

return 1;
}

最佳答案

由于 oppFunc f 是一个成员函数指针,您应该使用特殊语法通过成员函数指针进行调用:

q = (this->*f)(p, i);

关于C++模板中函数指针的c++错误C2064,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6913221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com