相关疑难解决方法(0)

奇怪的错误C2275 ...非法使用此类型作为具有成员函数模板和lambdas的表达式

摘要

由于某种原因,调用lambda函数的成员函数模板无法使用错误C2275进行编译...非法使用此类型作为表达式,但是当函数移出为自由函数时,它会正确编译.

细节

首先,我有一个基类,将function实例保存在一个vector.只有派生类可以通过调用向其添加function实例.可以通过调用公开调用所有实例.派生类将lambdas添加为实例.那些lambdas将依次用另一个"内部"lambda 调用基类函数模板.模板参数to 是一个异常类型,在执行"内部"lambda时将被显式捕获:vectoradd_externalfunctioninvoke_externalsfunctioninvoke_internalinvoke_internalinvoke_internal

using namespace std;

class base
{
public:
    void invoke_externals()
    {
        for (auto it = funcs_.begin(); it != funcs_.end(); ++it)
        {
            (*it)();
        }
    }

protected:
    void add_external(function<void(void)> func)
    {
        funcs_.push_back(func);
    }

    template <typename T>
    void invoke_internal(function<void(void)> func)
    {
        try
        {
            func();
        }
        catch (const T&){}
        catch (...){}
    }

    vector<function<void(void)>> funcs_;
};
Run Code Online (Sandbox Code Playgroud)

然后我有两个琐碎的自由函数抛出logic_errorruntime_error异常.这些函数将在以下调用的"内部"lambda中使用invoke_internal …

c++ lambda templates c++11

3
推荐指数
1
解决办法
7042
查看次数

在lambda中使用类模板参数时编译错误

我正在尝试在C++中重新创建C#的委托类型的一些行为,并且我在编译时遇到了一个特定的错误 - 这里是相关的代码:

struct Nil { };

// Represents a C# Func
template <typename returnType = void,
          typename T1 = Nil,
          typename T2 = Nil,
          typename T3 = Nil>
class Func
{
public:
    vector<function<returnType(T1, T2, T3)>> _funcs;

    void operator+=(returnType (*functionPointerToAdd)(T1))
    {
        auto myFunc = [&] ( returnType (*functionPointerToAdd)(T1) )
                     -> returnType (*)(T1, T2, T3)
                     { functionPointerToAdd(T1); };
        // add myFunc to the vector of functions...
    }
};
Run Code Online (Sandbox Code Playgroud)

我想要做的是将一个函数指针包装在一个闭包中,该闭包的签名与该类的完整模板类型相匹配(有效地"丢弃"设置为'Nil'的值).我得到的错误是:

error C2275: 'T1' : illegal use of this type as an expression …
Run Code Online (Sandbox Code Playgroud)

c++ lambda templates delegates c++11

3
推荐指数
1
解决办法
351
查看次数

标签 统计

c++ ×2

c++11 ×2

lambda ×2

templates ×2

delegates ×1