我编写了一个简单的C ++程序来接受回调。
回调是做什么的?回调是main函数的第二个参数,它只返回一个字符串,然后该字符串由main函数插入到.txt文件中。
错误是什么? Visual Studio 2013会抛出此错误:
error C2664: 'void WriteToFile(std::string,std::string (__cdecl *)(std::string))' : cannot convert argument 2 from 'std::string' to 'std::string (__cdecl *)(std::string)'
以下是代码:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void WriteToFile(string filename, string (*f)(string) )
{
ofstream FileProcessor;
FileProcessor.open(filename, ios::app);
FileProcessor << &f << endl;
}
string Printer(string Content)
{
return Content;
}
int main()
{
WriteToFile("test.txt", Printer("exampleText"));
}
答案 0 :(得分:1)
WriteToFile
期望第二个参数是函数指针,而不是函数调用的结果。将呼叫更改为如下所示:
WriteToFile("test.txt", Printer);
但是,它没有多大意义,因为&f
是函数的地址,所以它只打印一些十六进制值。您可能想要调用函数指针:
FileProcessor << (*f)("exampleText") << endl;
要传递参数,您有两个选择。 Vinayak Garg列出了一个,即向WriteToFile
添加第三个参数。另一个是使用std::bind
。
WriteToFile("test.txt", std::bind(&Printer, "exampleText"));
在后一种情况下,它看起来不像是需要参数。您对WriteToFile
的定义应如下所示(未经测试):
void WriteToFile(string filename, const std::function<string()> &f )
{
...
FileProcessor << f() << endl;
}
答案 1 :(得分:1)
AFAIK Printer("exampleText")
传递错误。函数WriteToFile
的第二个参数接受指向函数的指针。所以只需传递函数Printer
。
传递的函数指针的参数应该作为不同的参数发送。
像 -
void WriteToFile(string filename, string (*f)(string), string mystring )
{
ofstream FileProcessor;
FileProcessor.open(filename, ios::app);
FileProcessor << f(mystring) << endl;
}
然后调用
WriteToFile("test.txt", Printer, "exampleText");