Проблема с функцией обратного вызова C ++

0

Я написал простую программу C++, чтобы принять обратный вызов.

Какой обратный вызов? обратный вызов является вторым аргументом основной функции и он просто возвращает строку, эта строка затем вставляется в файл.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"));


}
Теги:

2 ответа

1

Printer("exampleText") передается неправильно. Второй аргумент функции WriteToFile принимает указатель на функцию. Так что просто передайте функцию Printer.

Аргумент для переданного указателя функции должен быть отправлен как другой аргумент.

Что-то like-

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");
1

WriteToFile ожидает, что второй аргумент будет указателем функции, а не результатом вызова функции. Измените вызов так, чтобы он выглядел следующим образом:

WriteToFile("test.txt", Printer);

Тем не менее, это не имеет большого смысла, потому что &f является адресом функции, поэтому он просто печатает какое-либо шестнадцатеричное значение. Вероятно, вы хотите вызвать указатель функции:

FileProcessor << (*f)("exampleText") << endl;

Для передачи аргумента у вас есть два варианта. Vinayak Garg перечислил один, который должен добавить третий аргумент в WriteToFile. Другой - использовать std::bind.

WriteToFile("test.txt", std::bind(&Printer, "exampleText"));

В последнем случае это будет не так, как будто он принимает аргумент. Ваше определение WriteToFile должно выглядеть так (untested):

void WriteToFile(string filename, const std::function<string()> &f )
{
    ...
    FileProcessor << f() << endl;
}
  • 0
    так как тогда я должен передать аргумент? Как это происходит в Javascript или PHP?
  • 0
    Не уверен, что вы имели в виду функцию более высокого уровня или просто дополнительный аргумент. Объяснил бывший
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню