加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在lambda中使用类模板参数时出现编译错误

发布时间:2020-12-16 09:35:49 所属栏目:百科 来源:网络整理
导读:我正在尝试在C中重新创建C#的委托类型的一些行为,并且在编译时我遇到了一个特定的错误 – 这里是相关的代码: struct Nil { };// Represents a C# Functemplate typename returnType = void,typename T1 = Nil,typename T2 = Nil,typename T3 = Nilclass Fun
我正在尝试在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,T3)
                     { functionPointerToAdd(T1); };
        // add myFunc to the vector of functions...
    }
};

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

error C2275: 'T1' : illegal use of this type as an expression

我正在使用MSVC10,我尝试按照Accessing a class template parameter type inside a member function with a lambda fails键入模板变量,但无济于事.我意识到这个特定的实现存在一些问题,我将遇到这个问题,但除此之外,我只是好奇为什么我不能在lambda语句中使用类的模板参数.

解决方法

我认为你仍然有一点点混乱的0x语法.

auto myFunc = [&] ( returnType (*functionPointerToAdd)(T1) ) -> returnType (*)(T1,T3) { functionPointerToAdd(T1); };

这条线就是问题所在.让我们分开吧:

auto myFunc = [&]

这将创建一个未定义类型的局部变量,它接收一个lambda(很好)并启动一个lambda,它通过引用获取函数指针.指针将会消失,为了简单起见,最好使它成为[=](你将更多地复制一个完整的指针 – 没有大问题).

( returnType (*functionPointerToAdd)(T1) )

这是lambda的参数.这意味着应该使用returnType(*)(T1)类型的函数指针调用lambda(!).这不是你想要的 – 你想用T1,T3来调用它.

-> returnType (*)(T1,T3)

这定义了lambda的返回类型 – 只有那个.你现在要说它必须返回一个函数指针,返回一个函数返回一个returnType并将T1,T2和T3作为参数.然后是lambda类型

(returnType(*)(T1,T3)) (*)(returnType(*)(T1))

,或将函数指针作为参数并返回函数指针的函数.是的,它过于复杂且难以理解.

{ functionPointerToAdd(T1); };

这最终是lambda的内容和你的错误的原因.您将类型T1作为参数传递给函数指针.

修复它的建议(因为语法非常复杂 – 我希望上面的文字可以帮助你改变我的原因:

auto myFunc = [=] ( T1 arg,T3 ) -> returnType { return functionPointerToAdd(arg); }

随意问为什么&怎么样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读