0

次のコードは私に与えます

test2.cc:248:14: error: no match for call to '(Integrator) (Input, double)'
test2.cc:249:11: error: no match for call to '(Integrator) (Integrator&, double)'

コンパイルについて。

class Integrator : public Block {
    private:
            ... 
        Input input;    
        double init_value;              
    public:
        Integrator();
        Integrator(Input i, double initval = 0) : input(i), init_value(initval) {}
        Integrator(Integrator &i, double initval = 0) : input(i), init_value(initval) {}
...
};

// + is overloaded
Input operator + (Input a, Input b) { return new Add(a,b); }

int main() {
    Constant a(4.0); // Input
    Integrator x,y;
    ...
    x(y + a, 0.0); // + is overloaded for Inputs
    y(x, -2.0);
    ...
}

これは宿題なので、コードの一部のみを投稿しています。これらが十分でない場合は、さらに追加できます。同様のコードが機能しているのを見たので、それを(いくつか編集して)使用しようとしましたが、うまくいきません...

4

3 に答える 3

2

宣言後にオブジェクトを初期化することはできません。x()関数として呼び出そうとしxます。

于 2012-12-04T12:47:11.027 に答える
2

あなたがやろうとしていることは、初期化でのみ機能します。または、そのような引数を取るメンバー関数を作成する必要があります。

Integrator x; 
x(1.2) // Calling the constructor doesn't make sense here

コンストラクターは、初期化時にのみ直接呼び出すことができます (既に述べたように)。

Integrator x(1.2) ;

メンバー関数は、進むべき道のように思えます。

于 2012-12-04T12:47:29.577 に答える
2

オブジェクトが定義された後、コンストラクターを使用してオブジェクトを「初期化」することはできません。できることは、必要なoperator()構文の関数をオーバーライドすることです。

class Integrator : public Block {
    ...

public:
    void operator()(Input i, double initval = 0)
        {
            input = i;
            init_value = initval;
        }

    ...
};
于 2012-12-04T12:48:48.967 に答える