【问题标题】:Template class strange behaviour VS2013模板类奇怪行为VS2013
【发布时间】:2023-03-26 02:40:01
【问题描述】:

我有一个模板类:

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 上调用某些内容的行上给出了编译失败。它说操作的左边不是类/结构/联合。

嗯?我错过了什么明显的东西吗?

【问题讨论】:

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


    【解决方案1】:

    这声明了一个函数p2

    Wrapper<thing> p2(thing());
    

    它返回Wrapper&lt;thing&gt; 并有一个thing(*)() 类型的未命名参数。你需要:

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

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

    【讨论】:

    • Nitpicker's corner:正如声明的那样,p2 不采用 thing 类型的参数,而是采用 thing() 类型的参数 - 一个没有参数并返回 thing 的函数
    • @IgorTandetnik 差不多。确切地说,它是一个函数 pointer thing(*)()。更新了答案。
    • 如果 VS2013 的 C++11 语法允许,“Wrapper&lt;thing&gt; p2(thing{});”也应该可以工作。大括号强制 p2 的初始化器中的内容是一个对象,所以它不能是一个函数声明。
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多