【问题标题】:Error in defining an std::pair C++17: unmatched constructor定义 std::pair C++17 时出错:构造函数不匹配
【发布时间】:2021-03-08 00:13:29
【问题描述】:

我正在尝试以下定义:

std::pair<std::int16_t, std::function<bool()>> urlvaliditypair = std::make_pair(enumIter, &CheckSequence::checkURLValidity);

另一个相关的定义尝试:

std::map<std::int16_t, std::function<bool()>> urlvalidityfunc = new std::map<std::int16_t, std::function<bool()>>(enumIter, &CheckSequence::checkURLValidity);

其中,函数checkURLValidity定义为:

bool CheckSequence::checkURLValidity() { return true; }

请指出以下编译错误可能是什么问题:

error: no viable conversion from 'pair<typename __make_pair_return<short &>::type, typename __make_pair_return<bool (CheckSequence::*)()>::type>' (aka 'pair<short, bool (conformance::download::CheckSequence::*)()>') to 'std::pair<std::int16_t, std::function<bool ()> > *' (aka 'pair<short, function<bool ()> > *')
            std::pair<std::int16_t, std::function<bool()>> *urlvalidityfunc = std::make_pair(enumIter, &CheckSequence::checkURLValidity);

我尝试了许多变体,但这个错误试图传达什么? std::pair 和 std::map 定义都有一个不匹配的构造函数错误。我也试过 std::mem_fn。

目标是用迭代器和相应的方法构建一个表/映射。请指教。

【问题讨论】:

  • 如果CheckSequence::checkURLValidity() 不是static 成员函数,那么如果没有CheckSequence 的实例,这就是不够的可调用对象。此外,我不确定从成员函数到std::function 的隐式转换是否仍然适用于std::make_pair() 中的类型推导。您是否尝试过在您的众多变体 中显式构造std::function 实例?顺便提一句。 minimal reproducible example 不会受伤。
  • 两种有效的变体(即使在 std::make_pair() 中进行类型推断):Live Demo on coliru
  • @Scheff,感谢您提供演示代码。使用您的建议。但是,相关调用仍然显示错误。虽然 insert 调用适用于地图,但 insert_or_assign 调用为什么会抱怨?不过,感谢您提供有关工作构造的指标。问候
  • 虽然 insert 调用适用于地图,但 insert_or_assign 调用为什么会抱怨? 不知道。它不在我身边:Life Demo on coliru

标签: c++ exception definition


【解决方案1】:

问题是new 不是你在这里想的那样。它不像 Java 或 c#,所以你不要这样做:

int i = new int(2);

它只是:

int i = 2;

或者在你的情况下:

std::map<std::int16_t, std::function<bool()>> urlvalidityfunc =
    {{enumIter, &CheckSequence::checkURLValidity}};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多