1. ホーム
  2. c++

[解決済み] 1つの引数を取る関数に評価されないterm

2022-02-07 10:18:33

質問

なぜ、このような現象が起こるのか、誰か説明してください。

error C2064: term does not evaluate to a function taking 1 arguments

を行に追加してください。

DoSomething->*pt2Func("test");

このクラスで

#ifndef DoSomething_H
#define DoSomething_H

#include <string>

class DoSomething
{
public:
    DoSomething(const std::string &path);
    virtual ~DoSomething();

    void DoSomething::bar(const std::string &bar) { bar_ = bar; }

private:
    std::string bar_;
};

#endif DoSomething_H

そして

#include "DoSomething.hpp"

namespace
{

void foo(void (DoSomething::*pt2Func)(const std::string&), doSomething *DoSomething)
{
    doSomething->*pt2Func("test");
}

}

DoSomething::DoSomething(const std::string &path)
{
    foo(&DoSomething::bar, this);

}

解決方法は?

問題点その1。 第2引数の名前と型がなぜか入れ替わっている。そうでなければならない。

      DoSomething* doSomething
//    ^^^^^^^^^^^  ^^^^^^^^^^^
//    Type name    Argument name

の代わりに

    doSomething* DoSomething

というのがありますね。

問題点その2。 関数が正しくデリファレンスされるように、2つの括弧を追加する必要があります。

    (doSomething->*pt2Func)("test");
//  ^^^^^^^^^^^^^^^^^^^^^^^

最終的には、こんな感じになります。

void foo(
    void (DoSomething::*pt2Func)(const std::string&), 
    DoSomething* doSomething
    )
{
    (doSomething->*pt2Func)("test");
}

そして、こちらは ライブ例 を実行すると、プログラムがコンパイルされます。