2013-07-04 21 views
0
//Menu.h 

#include<iostream> 
#include<conio.h> 
#include <map> 
#include <string> 
#include <functional> 
#include <utility> 

using namespace std; 
map<string,function< void() > > mapa; 
string names[100]; 
string functions[100]; 
char keys[100]; 
int pos=0; 

void menu(string name,char key,string functionc) 
{ 
    names[pos]=name; 
    keys[pos]=key; 
    functions[pos]=functionc; 
    mapa.insert(map<string,function< void()> >::value_type(functionc,functionc)); 
    pos++; 
} 

void write() 
{ 
    for(int i=0;i<pos;i++) 
    { 
     cout<<names[pos]<<" "; 
     cout<<endl; 
    } 
} 

ERROR: Error 1 error C2064: term does not evaluate to a function taking 0 arguments我不明白,在地圖上的這個錯誤插入

//Main.cpp 
    #include <iostream> 
    #include <map> 
    #include <string> 

    #include"Menu.h" 
    using namespace std; 

    void ime() 
    { 
    cout<<"k"; 
    } 

    int main() { 
    menu("ime1",'c',"ime"); 
    pisi(); 

    system("PAUSE"); 
     return 0; 
    } 

我想讓頭通用的,因此用戶可以在菜單中進行。 將清點其名稱和需要被壓來訪問它的功能 用戶將做出自己的功能,然後從它需要使用它的頭它焦炭....

+0

有關Visual Studio的一個好處是,您可以查找所有錯誤代碼的含義(本例中爲C2064)。只需搜索「MSDN C2064」。 – Simon

+0

請不要使用命名空間標準;在標題中。實際上,請不要將大部分代碼放在標題中 – doctorlove

+0

好吧,我將創建一個新文件cpp,然後包含它:P – Nameless

回答

1

我可以從而改變它使你的代碼編譯:

#include <iostream> 
#include <conio.h> 
#include <map> 
#include <string> 
#include <functional> 
#include <utility> 

using namespace std; 
map<string,string > mapa; 
string names[100]; 
string functions[100]; 
char keys[100]; 
int pos=0; 
void menu(string name,char key,string functionc) 
{ 

    names[pos]=name; 
    keys[pos]=key; 
    functions[pos]=functionc; 
    mapa.insert(std::make_pair(functionc,functionc)); 
    pos++; 
} 
void write() 
{ 
    for(int i=0;i<pos;i++) 
    { 
     cout<<names[pos]<<" "; 

     cout<<endl; 
    } 
} 

我被menu.h評論頂部擔心 - 這是一個頭文件? 現在,它已經對編譯錯誤進行了排序,但可能沒有做到你想要的。你想要一個名稱地圖的功能?

std::map<std::string, std::function<void()>> strings_to_functions; 

與函數採取任何參數和返回void,例如

void fn1() 
{ 
    std::cout << "fn1\n"; 
} 

我現在可以把它添加到地圖中,

strings_to_functions.insert(std::make_pair("fn1", fn1)); 

,並調用它

strings_to_functions["fn1"](); 
+0

你知道,無論如何make_pair做的事情ty – Nameless

1

您皆爲試圖進行std::function<void()>std::string這裏:

map<string,function< void()> >::value_type(functionc,functionc) 
     //           ^^^^^^^^^ 

你需要傳遞的東西是可調用的不帶任何參數,返回void。例如:

void foo() {}; 

mapa.insert(std::make_pair(functionc, foo)); 
+0

然後插入地圖的值類型,而不是std :: pair – doctorlove

+0

是的,我知道的是有解決方案還是更好的方法呢? – Nameless

+0

將函數添加到地圖,或將地圖更改爲std :: map 。 – doctorlove

4

C++不支持這一點。您需要一種名爲反射的編程語言屬性。

改爲使用腳本語言。

0
//MENU.h 
#include<iostream> 
#include<conio.h> 
#include <map> 
#include <string> 
#include <functional> 
#include <utility> 

using namespace std; 
map<string,function< void() > > mapa; 
string names[100]; 
string functions[100]; 
char keys[100]; 
int pos=0; 

void menu(string name,char key, function< void() >functionc) 
{ 
    names[pos]=name; 
    keys[pos]=key; 
    functions[pos]=functionc; 
    mapa.insert(std::make_pair(name,functionc)); 
    pos++; 
} 

//Main.cpp 
    #include <iostream> 
    #include <map> 
    #include <string> 

    #include"Menu.h" 
    using namespace std; 

    void ime() 
    { 
    cout<<"k"; 
    } 

    int main() { 
    menu("ime1",'c', ime); 
    pisi(); 

    system("PAUSE");`enter code here` 
     return 0; 
    } 
+1

這不是一個答案,只是一個代碼轉儲。請解釋*爲什麼*和*如何*它解決了OP面臨的問題。 –

+0

爲什麼:因爲地圖<字符串函數>需要一個函數沒有返回,沒有爭吵的價值,所以你必須在地圖上插入函數< void() > functionc而不是字符串functionc – Programmer

+0

你應該解釋一下(如果這是毋庸置疑的,在你的答案中)。這就是答案。不代表傾銷代碼*沒有解釋*。既然你似乎能夠提供解釋,爲什麼不編輯它呢?它甚至會爲你贏得一枚徽章。 (= –