gpt4 book ai didi

c++ - 没有名为 'argument_type' 的类型

转载 作者:行者123 更新时间:2023-11-28 04:28:04 25 4
gpt4 key购买 nike

我有这个功能:

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));
}

我该如何解决这个错误?

感谢您的评论。

最佳答案

如果我没理解错的话,你正在使用 void_bind()从第一个模板参数派生的类型,F ,

F::argument_type

这是在 std::function<R(Args...)> 中定义的类型名称(在 C++17 中已弃用)但只有当 Args...只有一种类型(仅当函数只接收一个参数时)。

但是你传递给void_bind()一个通用的 lambda

FuncAfterQuery(void_bind([this](auto&& data) { return this->RefreshCommentForce(data); }, [...]

那不是 std::function并且没有定义 argument_type

所以我建议(但我不能证明......你的例子是次优的)将 lambda 保存在适当的 std::function 中并通过 std::functionvoid_bind()

作为

std::function<RetType(ArgType)>
f { [this](auto&& data) { return this->RefreshCommentForce(data); } };

FuncAfterQuery(void_bind(f, ch->GetPlayerID()), [...]

使用适当的 (?) RetTypeArgType类型。

关于c++ - 没有名为 'argument_type' 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53752341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com