摘要
由于某种原因,调用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_error和runtime_error异常.这些函数将在以下调用的"内部"lambda中使用invoke_internal …
我正在尝试在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)