我对模板化类有问题。
当我在堆栈上实例化该类时,它可以工作
当我在堆上实例化相同的类时,它将失败。 (参数推导)
我不明白为什么

信息:我在c++ 17中使用gcc 7.2.0。

这里有个例子:

#include <iostream>
#include <cstdlib>
#include <memory>

template <class ReturnType, class ClassName, class... Args>
class MethodPtr
{
public:
    typedef ReturnType (ClassName::*Method)(Args...);

    MethodPtr(ClassName* ptr, Method m) : _p(ptr), _m(m)
    {
        (ptr->*m)(4);
    }

    ClassName* _p;
    Method _m;
};

class Example
{
public:
    Example()
    {
        dotest(this, &Example::func);
    }

    template <class Ptr, class Func>
    void dotest(Ptr ptr, Func func)
    {
        // works
        MethodPtr(ptr, func);

        // don't works
        //std::make_unique<MethodPtr>(ptr, func);
        //new MethodPtr(ptr, func);

        //works
        std::make_unique<decltype(MethodPtr(ptr, func))>(ptr, func);
        new decltype(MethodPtr(ptr, func))(ptr, func);
    }

    void func(int i)
    {
        std::cout << i << std::endl;
    }
};

int main()
{
    Example example;
}

您有解决方案避免使用decltype吗?

谢谢,

最佳答案

new MethodPtr(ptr, func)无法推论的事实确实是编译器错误。根据[dcl.type.class.deduct]/2:



如您所见,对于新表达式,显式使用"is",对任何未明确允许的内容使用全面禁止。因此,不能给make_unique一个占位符。

除非您可以迁移到已修复此问题的GCC版本(或者您只需要使用make_unique),否则无法避免decltype。尝试引入类型别名以减轻不便。

关于c++ - 模板推导在堆上失败,但在堆栈上有效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50923913/

10-13 08:34