0

さて、私は比較的C ++に慣れていないので、関数ポインターの使用方法を理解しようとしています。単純な数値積分である関数があり、積分する関数と積分の限界をそれに渡そうとしています。私はこれをXcodeで行っていますが、メインコードに「SimpsonIntegrationを呼び出すための一致する関数がありません」というエラーがあります。誰かが助けていただければ幸いです。また、私は学んでいるので、他の批判も同様に高く評価されます。main.cpp 関数は以下のとおりです。

#include <iostream>
#include "simpson7.h"
#include <cmath>

using namespace std;



int main(int argc, const char * argv[])
{
    double a=0;
    double b=3.141519;
    int bin = 1000;

    double (*sine)(double);
    sine= &sinx;



    double n = SimpsonIntegration(sine, 1000, 0, 3.141519);

      cout << sine(0)<<"  "<<n;
}

simpson.h ファイルは次のとおりです。

#ifndef ____1__File__
#define ____1__File__

#include <iostream>
template <typename mytype>

 double SimpsonIntegration(double (*functocall)(double) ,int bin, double a, double b);
 extern double (*functocall)(double);
 double sinx(double x);

#endif /* defined(____1__File__) */

simpson.cpp ファイルは次のとおりです。

#include "simpson7.h"
#include <cmath>
#include <cassert>


//The function will only run if the number of bins is a positive integer.



double sinx(double x){

    return sin(x);
}

double SimpsonIntegration( double (*functocall)(double),  int bin, double a, double b){

    assert(bin>0);
    //assert(bin>>check);

    double integralpart1=(*functocall)(a), integralpart2=(*functocall)(b);
    double h=(b-a)/bin;
    double j;

    double fa=sin(a);
    double fb=sin(b);

    for (j=1; j<(bin/2-1); j++) {
        integralpart1=integralpart1+(*functocall)(a+2*j*h);
    }

    for (double l=1; l<(bin/2); l++) {
        integralpart2=integralpart2+(*functocall)(a+(2*l-1)*h);
    }

    double totalintegral=(h/3)*(fa+2*integralpart1+4*integralpart2 +fb);



    return totalintegral;

}

さて、コンパイルしようとしたばかげたエラーを修正したので、次のエラーが発生しました:「リンカーコマンドが終了コード1で失敗しました」。

4

1 に答える 1

4

ヘッダーファイルを見ると、この宣言があります

template <typename mytype>
double SimpsonIntegration(double (*functocall)(double) ,int bin, double a, double b);

そして、あなたが持っているソースファイルで

double SimpsonIntegration( double (*functocall)(double),  int bin, double a, double b)

それは同じ機能ではありません。コンパイラは非テンプレート関数を検索しようとしますが、それは宣言されていないため、エラーが発生します。

簡単な解決策は、ヘッダー ファイルのテンプレート仕様を削除することです。

関数をテンプレート関数にしたい場合は、宣言と定義の分離に注意する必要があります。たとえば、この古い質問を参照してください

于 2013-11-04T06:33:06.477 に答える