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;

这意味着它pToFunc是一个指向函数的指针,该函数返回bool并获取字符串作为参数,并指向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));

只有一个*,在参数名称旁边。返回类型仍然是bool而不是bool*

然后,您需要将指针传递给该函数。这是错误的:

toDecimal(roman,  *checker)

要制作指针,您可以使用&获取地址,*然后再取消引用。函数在这方面并没有太大的不同,只是函数和函数指针之间的转换在某些情况下是隐式的。我更喜欢明确。所以这个电话应该是:

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