-1

文字列から関数へのポインタマップに格納されている任意の関数を呼び出すために使用される関数のtypedefを作成しています。この問題は、コード内の多くのオブジェクトを介して型が宣言および参照される方法に関係していると確信していますが、必要なことを実行する方法を考えることができる唯一の方法です。

これはfmap.hです。ここでfmapクラスとexecutefunctionsクラスを宣言します。関数ポインターのtypedefは、fmapのパブリックメンバーの最初の行にあります。

class Web;
class Matlab;
class Word;
class Node;

class ExecFunctions
{
public:
    ExecFunctions(){}
    /**
    Function:       travel
    */
    int travel(Web *concepts, Matlab *mat, Word * words, int reqIdx, string theWord, vector<string> *dependsMet);

};

class FMap
{
public:
    typedef int (ExecFunctions::*ExecFunc)(Web *, Matlab *, Word *, int, string, vector<string> *);
    ExecFunc getFunc(string funcName){
        return theFuncMap.descrToFuncMap[funcName];
    }

private:
    class FuncMap {
    public:
        FuncMap() {
                descrToFuncMap["travel"] = &ExecFunctions::travel;  
        }
        std::map<std::string, ExecFunc> descrToFuncMap;
    };    
};



#endif

次はweb.hです。関連する部分だけを含めています。

#include "fmap.h"

class Node
{
    private:
        ....
        //pointer to execcution function
        FMap::ExecFunc func;
        //fmap function used to access execution function pointers
        FMap *functionMap;
            .....    
public:
          FMap::ExecFunc getExecFunc();
};

今私が思うのはweb.cppの関連部分です

Node::Node(string name, Node *nodeParent)
{
    attrList = new Attr();
    nodeName = name;
        ........
    func = functionMap->getFunc(name);
}

ついに。これがエラーが発生する場所です。エラー行の前に、発生しているエラーを説明する3行のコメントがあります。

void process(Util myUtil, Web *concepts, Matlab *mat, string path)
{
    int funcP
    bool dependsProcessed = false;
    vector<string> *dependsDone = new vector<string>();
    FMap::ExecFunc funcToCall;

    funcToCall = realMeanings[i][j]->getConcept()->getExecFunc();


//the line bellow this comment is where I'm getting the error. Visual Studio says
//that funcToCall must have (pointer-to) function type, and then the VS compiler says
//diabot.cpp(177): error C2064: term does not evaluate to a function taking 6 arguments
    funcPtrRet = funcToCall(concepts, mat, realMeanings[i][j], reqConceptsIdx[i][j], queryWords[i], dependsDone);

    return;
}

誰でもできる助けをいただければ幸いです。

よろしくお願いします

4

3 に答える 3

0

コード全体を読んで迷子になったわけではありませんが、メソッド ポインター型であるためfuncToCall()ExecFunctionsインスタンスを呼び出す必要があると思います。ExecFunc

次の構文を使用すると、何が得られますか。

ExecFunctions ef;
ef.*funcToCall(...);

また

ExecFunctions* ef = ...;
ef->*funcToCall(...);
于 2011-04-28T07:28:59.227 に答える