2017-05-31 81 views
0

我想用異步函數在一個大的csv文件上一次運行多個進程,以避免長時間等待用戶但是我得到的錯誤:沒有實例的重載函數「async」匹配參數列表

no instance of overloaded function "async" matches the argument list 

我已經搜索了一下,沒有發現任何修復它,並出於想法,因爲我很新的編碼C++任何幫助將不勝感激!我在下面列出了所有的代碼。

#include "stdafx.h" 
#include <cstring> 
#include <fstream> 
#include <iostream> 
#include <string> 
#include <algorithm> 
#include <future> 
using namespace std; 

string token; 
int lcount = 0; 
void countTotal(int &lcount); 

void menu() 
{ 
    int menu_choice; 

    //Creates the menu 
    cout << "Main Menu:\n \n"; 
    cout << "1. Total number of tweets \n"; 

    //Waits for the user input 
    cout << "\nPlease choose an option: "; 
    cin >> menu_choice; 

    //If stack to execute the needed functionality for the input 
    if (menu_choice == 1) { 
     countPrint(lcount); 
    } else { //Validation and invalid entry catcher 
     cout << "\nPlease enter a valid option\n"; 
     system("Pause"); 
     system("cls"); 
     menu(); 
    } 
} 

void countTotal(int &lcount) 
{ 
    ifstream fin; 
    fin.open("sampleTweets.csv"); 

    string line; 
    while (getline(fin, line)) { 
     ++lcount; 
    } 

    fin.close(); 
    return; 
} 

void countPrint(int &lcount) 
{ 
    cout << "\nThe total amount of tweets in the file is: " << lcount; 

    return; 
} 


int main() 
{ 
    auto r = async(launch::async, countTotal(lcount)); 
    menu(); //Starts the menu creation 

    return 0; 
} 
+2

'lcount'是一個全局變量,也由各地參照通過所有功能通過。在這一點上,它不需要是全球性的。此外,您正在爲全局變量和對該變量的引用使用相同的名稱。它會清除那個令人困惑的位。 –

回答

0

auto r = async(launch::async, countTotal(lcount)); 

沒有做什麼,你認爲它。它立即調用並評估countTotal(lcount),它返回void。該代碼因此無效。


看看documentation for std::async。它需要一個Callable對象。最簡單的方法來產生一個countTotalCallable推遲執行使用Lambda:

auto r = async(launch::async, []{ countTotal(lcount); }); 
+0

如果我使用變量lcount,那麼「100」還能工作嗎? –

+0

是的,你可以用lambda體內的任何'int&'調用'countTotal'。 '100'實際上不會工作,因爲它是一個右值 - 我確定了我的答案。 –

+0

或'auto r = async(launch :: async,countTotal,std :: ref(lcount));' – WhiZTiM

相關問題