繁体   English   中英

无法从 '<brace-enclosed initializer list> ' 到 map</brace-enclosed>

[英]could not convert from ‘<brace-enclosed initializer list>’ to map

我的代码如下:

class A{
private:
    size_t linearProbing(T k, size_t i);

    size_t quadraticProbing(T k, size_t i);

    size_t doubleHashing(T k, size_t i);

    std::map<std::string, size_t (*)(T, size_t)> probeFunctionMap = {
            {"linearProbing",    this->linearProbing},
            {"quadraticProbing", this->quadraticProbing},
            {"doubleHashing",    this->doubleHashing}
    };
}

错误是:

错误:无法转换 '{{"linearProbing", ((HashTableOpeningAddress<int>*)this)->HashTableOpeningAddress<int>::linearProbing}, {"quadraticProbing", ((HashTableOpeningAddress<int>*)this)-> HashTableOpeningAddress<int>::quadraticProbing}, {"doubleHashing", ((HashTableOpeningAddress<int>*)this)->HashTableOpeningAddress<int>::doubleHashing}}' 从 '<brace-enclosed initializer list>' 到 'std: :map<std::__cxx11::basic_string<char>, long unsigned int (*)(int, long unsigned int), std::less<std::__cxx11::basic_string<char> >, std::allocator< std::pair<const std::__cxx11::basic_string<char>, long unsigned int (*)(int, long unsigned int)> > >'

我猜我用来初始化 map 的方法是错误的,但我不知道如何更正。

function 指针无法存储您关心的 state(又名this )。 您需要能够存储此 state,以便以后在使用this map 时可以使用此调用。 一个例子可能是:

std::map<std::string, std::function<size_t(T, size_t)>>

std::function将让您存储 state。 但是您不能使用this->function_name创建 std::function 。 这接近于调用function。 所以你有2个选择:

  • std::bind - 硬
  • lambda - 简单

因此,让我们看一下 lambda。 一个例子是:

[this](T k, size_t i) { return functor(k, i); }
  ^ Capture our state, aka `this`
           ^ take the same arguments as the function we care about
                                 ^ Call the function we care about

我们可以设置一堆这样的 lambdas(使用宏方便):

 #define AS_FUNCTOR(functor) [this](T k, size_t i) { return functor(k, i); }

    std::map<std::string, std::function<size_t(T, size_t)>> probeFunctionMap = {
            {"linearProbing",    AS_FUNCTOR(linearProbing)},
            {"quadraticProbing", AS_FUNCTOR(quadraticProbing)},
            {"doubleHashing",    AS_FUNCTOR(doubleHashing)}

这将使我们可以使用 map! 活生生的例子

您正在混合 C 风格和 C++ 成员 function 指针。 您必须明确限定A::一切。

    typedef size_t (A::*ProbeFn)(T, size_t);

    size_t linearProbing(T k, size_t i);
    size_t quadraticProbing(T k, size_t i);
    size_t doubleHashing(T k, size_t i);

    std::map<std::string, ProbeFn> probeFunctionMap = {
            {"linearProbing",    &A::linearProbing},
            {"quadraticProbing", &A::quadraticProbing},
            {"doubleHashing",    &A::doubleHashing}
    };

然后调用:

    size_t useit( const std::string& fname, T t, size_t value ) {
        ProbeFn fn = probeFunctionMap[fname];
        return (*this.*fn)(t,value);
    }

或者

 return (this->*fn)(t,value);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM