模板类奇怪的行为VS2013

时间:2013-11-05 23:36:06

标签: c++ templates c++11 constructor visual-studio-2013

我有一个模板类:

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');

哪个好,并输出“拦截然后dosomething on g”。然后如果我尝试使用Wrapper的其他构造函数:

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

VS2013在我尝试在p2上调用某些内容的行上发生编译失败。它表示操作的左边不是类/结构/联合。

是吗?我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:2)

这声明了一个函数p2

Wrapper<thing> p2(thing());

返回Wrapper<thing>并且有一个类型为thing(*)()的未命名参数。你需要:

Wrapper<thing> p2((thing()));

thing t;
Wrapper<thing> p2(t);
相关问题