当前位置: 首页 > 知识库问答 >
问题:

c变量模板的错误

扈阳辉
2023-03-14

我有以下代码使用可变参数模板来调用std::async,

struct TestParent
{
    template< typename Fn, typeName ...Args >
    bool checkBlock( bool& toCheck,
                     Fn&& fn, Args&& ... args )
    {
        int startIndx = 0;
        int endIndx = 10;
        std::future< bool > tk( std::async( std::launch, fn, this,
                                            startIndx, endIndx, 
                                            toCheck, args ... ) );
        return tk.get();
     }
}

struct TestChild: public TestParent
{
    bool checkRules( const int, const int, bool& std::vector< bool >& );
    bool check();
}

bool TestChild::checkRules( const int startIndx, const int endIndx,
                            bool& toCheck,
                            std::vector< bool >& results )
{
    toCheck = true;
    for ( int indx = startIndx; indx < endIndx; ++ indx )
    {
        bool checkedOk;
        ... do something checking.
        results.push_back( checkedOk );
    }

    return true;
 }

bool TestChild::check()
{
    bool toCheck;
    std::vector< bool > results;
    return checkBlock( toCheck, &testChild::checkRules, this, &results);
}

但我收到以下编译错误消息:

没有用于调用“async(std::launch,bool (TestChild::

我认为这可能与我传递其他参数以及参数包的事实有关。任何人都知道这有什么问题,我应该做些什么来让它发挥作用?

共有2个答案

卫才哲
2023-03-14
return checkBlock( toCheck, &testChild::checkRules, this, &results);

您正在将this与您的Args一起传递,它与您的参数与您的函数不匹配,因此有一个额外的TestUNICEF*

return checkBlock( toCheck, &testChild::checkRules, ~~this~~, &results);

就是去掉~~这个~~

此外,您应该std::forward您的< code>Args如下所示:

                                        toCheck, std::forward<Args>(args) ... ) );
宗政唯
2023-03-14

这是守则中的两个主要问题:

(1) std::async在将所有传递的参数转发到提供的函数之前衰减它们,这意味着< code>checkRules中的references参数不同于< code>async在调用函数时试图使用的类型,您需要进行以下更改:

template< typename Fn, typename ...Args >
bool checkBlock( std::reference_wrapper<bool> const& toCheck,
                Fn&& fn, Args&& ... args )
{
    int startIndx = 0;
    int endIndx = 10;
    std::future< bool > tk(std::async(std::launch::async,
                                       std::forward<Fn>(fn),
                                       startIndx, endIndx,
                                       toCheck,
                                       std::forward<Args>(args) ... ) );
    return tk.get();
}

(2) 您将<code>this</code>作为参数传递给<code>checkBlock</code>它最终将作为<code>检查规则</code>的参数(通过异步调用),但成员函数不接受<code>TestChild*异步,因此需要使用std::bind来绑定参数,并使用std::wrap来修改参数:

#include <functional>
using namespace std::placeholders;

bool TestChild::check()
{
    bool toCheck;
    std::vector< bool > results;
    return checkBlock( std::ref(toCheck), std::bind(&TestChild::checkRules, this, _1, _2, _3, _4), std::ref(results));
}
 类似资料:
  • template.defaults.imports 模板通过 $imports 可以访问到模板外部的全局变量与导入的变量。 导入变量 template.defaults.imports.log = console.log; <% $imports.log('hello world') %> 内置变量清单 $data 传入模板的数据 $imports 外部导入的变量以及全局变量 print 字符

  • 我的函数使用一组给定的输入参数(变量)调用Python函数,并返回包含函数输出的元组(变量,因为输出随调用的函数而变化)。 我正在使用C 11通过MinGW-w64编译器的g端口在视窗10机器上编译。我声明了这个模板变量函数(并调用它)如下: 但是,会引发此错误(为了可读性,缩短为):

  • 我目前正在从事一个项目,该项目需要一个生成简单XML的对象。我对XML很陌生,还在学习c 我试图实现的是一个可以在代码中这样调用的函数: 在这一行之后,字符串应该包含如下内容:

  • 问题内容: 我试图将值放入“标题”模板中,例如标题和导航链接,但无法访问我从包含的模板发送到主模板的变量。 渲染模板: index.html模板: header.html模板: 显然,它不会那样工作。 也许有一种方法可以解析/获取模板并将变量放入其中,而无需将整个头文件放入代码中?然后,我可以将该模板作为变量发送到我的主模板。但这似乎并不是最好的方法。 问题答案: 您可以在调用模板时将上下文传递给

  • 我想确认这个代码是合法的(还是不合法的?)C++17。 如果用G++和MSVC编译,我不会得到错误(并得到正确的输出), 但Intel和clang给出了一个错误: 使用编译(对于MSVC)。 在godbolt和我的本地机器上尝试了最新的编译器。

  • YDoc 主题的模板是若干的 jsx 组件,以下是各模板文件相对应的功能(按首字母排序): 模板 功能 Content.jsx 文档页内容 Footer.jsx (用户自定义组件) Footer 信息 Head.jsx html 文件中 部分的内容 Header.jsx 顶部导航 Homepage.jsx (用户自定义组件) 文档站首页 Hook.jsx 钩子,用于自定义插件 Icon.jsx f