Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译std::functions队列的模板函数时出错_C++ - Fatal编程技术网

C++ 编译std::functions队列的模板函数时出错

C++ 编译std::functions队列的模板函数时出错,c++,C++,我想制作一个模板函数来对常规函数和类成员函数进行排队。通过internet搜索,我得到了以下代码,但在编译时出现了错误 #include <iostream> #include <functional> #include <queue> #include <string> double MyFunction(double num1, double num2) { std::cout << "MyFunction( " <

我想制作一个模板函数来对常规函数和类成员函数进行排队。通过internet搜索,我得到了以下代码,但在编译时出现了错误

#include <iostream>
#include <functional>
#include <queue>
#include <string>

double MyFunction(double num1, double num2)
{
    std::cout << "MyFunction( " << num1 << ", " << num2 << " )\n";
    return num1 + num2;
}

class MyClass
{
public:
    double MyClassFunction(double num1, double num2, double num3) const
    {
        std::cout << "MyClass::MyClassFunction( " << num1 << ", " << num2 << ", " << num3 << " )\n";
        return num1 + num2 + num3;
    }
};

struct MyFunctionQueue
{
    template <typename FUNC, typename... ARGS>
    void QueueFunction(FUNC fn, ARGS&&... args)
    {
        std::function<std::result_of_t<FUNC(ARGS...)> () > rFunc = std::bind(fn, args...);
        _myFQ.push(rFunc);
    }

    void Execute()
    {
        while (!_myFQ.empty())
        {
            _myR.push(_myFQ.front()());
            _myFQ.pop();
        }
    }

    double PopResult()
    {
        double r = _myR.front();
        _myR.pop();
        return r;
    }

    std::queue<std::function<double()>> _myFQ;
    std::queue<double> _myR;
};


int main()
{
    MyFunctionQueue funcQue;

    funcQue.QueueFunction(MyFunction, 1.234, 2.345);

    MyClass obj;
    funcQue.QueueFunction(&MyClass::MyClassFunction, std::ref(obj), 1.234, 2.345, 3.456);

    funcQue.Execute();

    std::cout << "MyFunction result: " << funcQue.PopResult() << std::endl;
    std::cout << "MyClass::MyClassFunction result: " << funcQue.PopResult() << std::endl;
}
#包括
#包括
#包括
#包括
双MyFunction(双num1,双num2)
{
std::cout]
1> c:\program files(x86)\microsoft visual studio 14.0\vc\include\type\u traits(1469):错误C2893:未能专门化函数模板“未知类型std::invoke(_可调用&&,_类型&&…)
1> c:\program files(x86)\microsoft visual studio 14.0\vc\include\type\u traits(1469):注意:使用以下模板参数:
1> c:\ProgramFiles(x86)\microsoft visual studio 14.0\vc\include\type\u traits(1469):注意:“\u Callable=double(\u\u thiscall MyClass::*)(double,double,double)const”
1> c:\ProgramFiles(x86)\microsoft visual studio 14.0\vc\include\type\u traits(1469):注意:“\u Types={std::reference\u wrapper,double,double,double}”
1> c:\users\siu.chan\documents\visual studio 2015\projects\testfunctionqueue\testfunctionqueue\testfunctionqueue.cpp(31):错误C2440:“初始化”:无法从“std::\u Binder”转换为“std::function”
1> 与
1>          [
1> FUNC=double(uu thiscall MyClass::*)(double,double,double)const
1>          ]
1> c:\users\siu.chan\documents\visual studio 2015\projects\testfunctionqueue\testfunctionqueue\testfunctionqueue.cpp(31):注意:没有构造函数可以采用源类型,或者构造函数重载解析不明确
1> c:\users\siu.chan\documents\visual studio 2015\projects\testfunctionqueue\testfunctionqueue\testfunctionqueue.cpp(32):错误C2664:“void std::queue::push(const std::function&”):无法将参数1从“std::function”转换为“std::function&”
1> 与
1>          [
1> _Ty=std::function
1>          ]
1> c:\users\siu.chan\documents\visual studio 2015\projects\testfunctionqueue\testfunctionqueue\testfunctionqueue.cpp(32):注意:原因:无法从“std::function”转换为“std::function”
1> c:\users\siu.chan\documents\visual studio 2015\projects\testfunctionqueue\testfunctionqueue\testfunctionqueue.cpp(32):注意:没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符

因此,我认为这是vc++的一个问题。当下一个参数是指针时,传递成员函数可以正常工作,但当它是引用时,传递失败

template <class F, class... A>
std::result_of_t<F(A...)> Foo::bar(F f, A... a)
{
    return 0;
}

Foo f;
f.bar(&Foo::other_function, std::ref(f)); //error
f.bar(&Foo::other_function, &f); //success

这看起来不对:
std::result\u of\u t
。更像是
decltype(std::declval()(args…)
?这也会扰乱VC2015编译器:-(我想在使用带有
std::function
的成员函数时,您也希望通过指针传递对象,而不是引用。不过,我不知道这是否是问题所在。的
result\u将给您
FUNC
作为返回类型。这是编译的,谢谢James!:-OLol我只是在猜测。我应该回答这个问题。实际上,一个引用和指针一样可以接受。@PreferenceBean真的吗?我不确定,但我想一定是因为它解决了问题。这是一个奇怪的巧合。
std::function rFunc
在VS2015上运行得很好。我不知道你为什么建议用胡言乱语来代替它。@JamesRoot:INVOKE
的一个坏的实现没有被解决关于这个问题,尽管我之前没有找到任何关于这个问题的SO问题,如果这确实是VS的行为,这是令人惊讶的。@nshct:在GCC上不适合我。我相信你误读了詹姆斯回答的这一部分。
template <class F, class... A>
std::result_of_t<F(A...)> Foo::bar(F f, A... a)
{
    return 0;
}

Foo f;
f.bar(&Foo::other_function, std::ref(f)); //error
f.bar(&Foo::other_function, &f); //success
template <class F, class... A>
struct Foo
{
    typedef std::result_of_t<F(A...)> type;
};

Foo<int(int), int> //fails in only vc++