我有这个功能:
void CGuild::AddComment(LPCHARACTER ch, const std::string& str)
{ if (str.length() > GUILD_COMMENT_MAX_LEN)
return;
char text[GUILD_COMMENT_MAX_LEN * 2 + 1];
DBManager::instance().EscapeString(text, sizeof(text), str.c_str(), str.length());
DBManager::instance().FuncAfterQuery(void_bind([this](auto&& data) { return this->RefreshCommentForce(data); }, ch->GetPlayerID()),
"INSERT INTO guild_comment%s(guild_id, name, notice, content, time) VALUES(%u, '%s', %d, '%s', NOW())",
get_table_postfix(), m_data.guild_id, ch->GetName(), (str[0] == '!') ? 1 : 0, text);
}
,我正在Linux环境下使用C ++ 1z中的clang ++-devel进行编译。该文件生成此错误:
./any_function.h:41:15: error: no type named 'argument_type' in '(lambda at
guild.cpp:1023:49)'
typename F::argument_type value;
~~~~~~~~~~~~^~~~~~~~~~~~~
guild.cpp:1023:39: note: in instantiation of template class 'void_binder<(lambda
at guild.cpp:1023:49)>' requested here
DBManager::instance().FuncAfterQuery(void_bind([this](auto&& dat...
^
这是any_function.h:
template <class F>
class void_binder
{
protected:
F f;
typename F::argument_type value;
public:
void_binder(const F& f, const typename F::argument_type x)
: f(f), value(x) {}
void operator()() const {
return f(value);
}
};
template <class F, class Arg>
inline void_binder<F> void_bind(const F& f, const Arg& arg)
{
typedef typename F::argument_type arg_type;
return void_binder<F>(f, arg_type(arg));
}
如何解决此错误?
谢谢您的评论。
答案 0 :(得分:1)
如果我理解正确,您在void_bind()
中使用的是从第一个模板参数F
派生的类型
F::argument_type
这是std::function<R(Args...)>
中定义的类型名(在C ++ 17中已弃用),但仅当Args...
仅是一种类型时(仅当函数仅接收一个参数时)。
但是您将通用lambda传递给void_bind()
FuncAfterQuery(void_bind([this](auto&& data) { return this->RefreshCommentForce(data); }, [...]
不是std::function
并且没有定义argument_type
因此,我建议(但我无法证明...您的示例是次优的)将lambda保存在适当的std::function
中并将std::function
传递给void_bind()
< / p>
类似
std::function<RetType(ArgType)>
f { [this](auto&& data) { return this->RefreshCommentForce(data); } };
FuncAfterQuery(void_bind(f, ch->GetPlayerID()), [...]
具有适当的(?)RetType
和ArgType
类型。