1

エラーが発生し続ける最後の行、未解決の外部。

bool checker(string roman);
// Adds each value of the roman numeral together
int toDecimal(string, bool (function)(string));
int convert(string roman, int i);

int main(){
    string roman;
    cout << "This program takes a roman numeral the user enters then converts it to decimal notation." << endl;
    cout << "Enter a roman numeral: ";
    cin >> roman;
    transform(roman.begin(), roman.end(), roman.begin(), toupper);
    cout << roman << " is equal to " << toDecimal(roman,  *checker) << endl;
}

プロトタイプを

int convert(string roman, int i);
int toDecimal(string, bool* (*function)(string));

そして最後の行に

cout << roman << " is equal to " << toDecimal(roman, *checker(roman)) << endl;

私は得る

不正なインダイレクション、「エラー 2 エラー C2664: 'toDecimal': パラメーター 2 を 'bool' から 'bool *(__cdecl *)(std::string)' に変換できません」

(*) のオペランドはポインターでなければなりません

4

2 に答える 2

1

これは、関数へのポインターを使用する方法です。

bool (*pToFunc) (string) = checker;

これはboolpToFuncを返し、文字列をパラメータとして取得する関数へのポインタであり、 を指しているという意味です。checker

このポインターを関数に次のように関数に送信します。

cout << roman << " is equal to " << toDecimal(roman,  pToFunc) << endl;

チェッカーを実装する必要があることを忘れないでください

しかし、あなたは C++ で書いているので、探しているものを達成するためのもっと良い方法があります。それは機能する可能性があります。

ファンクターを使用して、これを行う方法は次のとおりです。

ファンクタを定義します:

class romanFunctor {
   public:
     bool operator()(string roman) {\\ checker implementetion}
};

使用方法の例:

romanFunctor checker ;
string roman;
cin >> roman;
if (checker(roman) == true) {...}
于 2013-07-19T23:14:37.913 に答える
1

ここに問題があります:

int toDecimal(string, bool (function)(string));

function関数型のパラメーターとして宣言しています。しかし、関数を値渡しすることはできません (関数のコピーを作成するにはどうすればよいでしょうか?)。代わりに、関数へのポインターを受け入れる必要があります。

int toDecimal(string, bool (*fnptr)(string));

*引数名の横に1 つだけ。戻り値の型は stillboolであり、notbool*です。

次に、関数へのポインターを渡す必要があります。これは間違っています:

toDecimal(roman,  *checker)

ポインターを作成するには、 を使用&してアドレスを取得し、*後で逆参照します。関数と関数ポインタの間の変換が一部の状況で暗黙的に行われることを除いて、関数はこの点で大きな違いはありません。私は明示的であることを好みます。したがって、その呼び出しは次のようになります。

toDecimal(roman, &checker)
于 2013-07-19T23:29:09.890 に答える