2

テンプレートクラスがあります:

template <class T>
class Wrapper {
public:
    Wrapper() {};

    Wrapper(const T& object) : mObject(object){ };

    template <class F, class... Args >
    typename void operation(const F& f, Args... args)
    {
        std::cout << "intercept";
        (mobject.*f)(args...);
    }

private:
    T mObject;
};

それから私はそれを次のように使用します:

struct thing{
    void doSomething(char c) { cout << "dosomething on " << c; };
};

Wrapper<thing> p;
p.operation(&thing::doSomething, 'g');

これは問題なく、「Intercept then dosomething on g」を出力します。次に、次のように Wrapper の他のコンストラクターを使用しようとすると:

Wrapper<thing> p2(thing());
p2.operation(&thing::doSomething, 'f');

VS2013 では、p2 で何かを呼び出そうとした行でコンパイル エラーが発生します。左の操作はクラス/構造体/共用体ではないと言っています。

は?明らかな何かが欠けていますか?

4

1 に答える 1