class将引用传递给带有累积的仿函数

时间:2011-10-29 22:35:33

标签: c++ stl functor

我有一个来自另一个类的函数,而另一个类又来自虚拟基类。

在该函数内部是一个仿函数。仿函数需要能够访问此函数及其父类中的所有对象。但是,当传递对“this”或函数名称的引用时,我收到错误。

所有这些复杂化的原因是加速代码。我编码的算法实际上只有一个昂贵的部分。我的意图是并行化该部分。但是,该步骤通过几个步骤同时累积超过两个值。所以,我需要覆盖一些运算符。仿函数似乎是实现这一目标的最简单方法。

仿函数需要能够访问myClassA和myClassB中的对象,因此我需要使用对myClassB的引用来构造它。 (由于B从A下降,因此所有都应该是可访问的。)

问题在于,当我尝试将仿函数传递到累积行时,我得到关于没有匹配函数的错误。我试过“这个”,“* this”,“myClassA”,“myClassB”等等。

任何想法??

class myBaseClass {
public:
    virtual double doFancyStuff(double a, double b)=0;
    virtual double doOtherFancyStuff(double a, double b)=0;
}

class myClassA : public myBaseClass { // B inherits a bunch of stuff from myClassA
    public:
        double doFancyStuff(double a, double b){
            double C = pow(a,b); //dummy action, is actually a lot of fancy math here
            return C;
        }
        virtual double doOtherFancyStuff(double a, double b)=0;     
}

class myClassB : public myClassA { // B inherits a bunch of stuff from myClassA
    public:
         double doOtherFancyStuff(double a, double b){
            return pow(a * b, 3);  //dummy action, is actually a lot of fancy math here
        }

    double doMoreFancyStuff(double a, double b){
        // do some stuff

        struct MyFunctor : public binary_function<Fraction, DoubleIterator, Fraction> {
            MyFunctor(myClassB& in_class, doubleA) : myClassA(in_class), column(iColumn) {} // Note: constructed with reference to myClassB, so it can access all the objects (functions, data) in myClassB                
            myClassB& myClassB;
            doubleA;
            double B = 123.456;

            double operator()(double B, double A, ) {
                double C = doFancyStuff(A,B);
                C += doOtherFancyStuff(A,B,C);
                return C;
            }
        }
        A = 1234 // actually result of some other work in the real code.
        //use stl to accumulate
        accumulate(data.begin(), data.end(), temp, MyFunctor(this,  A) );  //Passing 'this' here so that functor gets a reference to myClassB
    }

1 个答案:

答案 0 :(得分:0)

您应该将函数移到函数外部。

未实现全新C ++ 11标准的编译器不允许使用本地类实例化accumulate之类的模板。