![](/img/trans.png)
[英]could not convert … from '<brace-enclosed initializer list>' to map
[英]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.