我在地图插页上不理解这个错误

时间:2013-07-04 10:54:15

标签: c++ map functional-programming

//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;
    }
}
  

错误:错误1错误C2064:术语未评估为函数   拿0个参数

//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;
    }   

我想使标题通用,以便用户可以制作菜单。 它会告诉它的名字以及需要按哪个字符来访问它的功能 用户将使用它自己的功能然后从它需要使用它的头....

4 个答案:

答案 0 :(得分:4)

C ++不支持此功能。您需要一个名为 reflection 的编程语言属性。

请改用脚本语言。

答案 1 :(得分:1)

您正试图从std::function<void()>点击std::string

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

你需要传递一些没有参数可调用的东西,返回void。例如:

void foo() {};

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

答案 2 :(得分: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"]();

答案 3 :(得分: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;
    }