C++ 无法对指向成员的指针使用std::hash的专门化?
我假设std::hash对泛型指针类型的专门化可以用于指向成员的指针,但是我不能这样使用它;相反,我的编译器给了我一个“不完整类型”错误,我认为这意味着“没有对指针使用std::hash的专门化?”?这是怎么回事C++ 无法对指向成员的指针使用std::hash的专门化?,c++,hash,stdhash,C++,Hash,Stdhash,我假设std::hash对泛型指针类型的专门化可以用于指向成员的指针,但是我不能这样使用它;相反,我的编译器给了我一个“不完整类型”错误,我认为这意味着“没有对指针使用std::hash的专门化?”?这是怎么回事 #include <functional> struct foo{ void bar(int a){} }; int main(){ std::hash<void (foo::*)(int)> hasher; } #包括 结构foo{ 空条
#include <functional>
struct foo{
void bar(int a){}
};
int main(){
std::hash<void (foo::*)(int)> hasher;
}
#包括
结构foo{
空条(int a){}
};
int main(){
散列哈希器;
}
错误:
..\src\m.cpp:43:32: error: aggregate 'std::hash<void (foo::*)(int)> hasher' has incomplete type and cannot be defined
。\src\m.cpp:43:32:错误:聚合“std::hash hasher”的类型不完整,无法定义
您必须先定义专门化,然后才能使用它
namespace std
{
template <>
struct std::hash<void (foo::*)(int)>
{
// Implement the class.
};
}
名称空间std
{
模板
struct std::hash
{
//实现这个类。
};
}
使用它
int main(){
std::hash<void (foo::*)(int)> hasher;
}
intmain(){
散列哈希器;
}
您必须先定义专门化,然后才能使用它
namespace std
{
template <>
struct std::hash<void (foo::*)(int)>
{
// Implement the class.
};
}
名称空间std
{
模板
struct std::hash
{
//实现这个类。
};
}
使用它
int main(){
std::hash<void (foo::*)(int)> hasher;
}
intmain(){
散列哈希器;
}
您必须先定义专门化,然后才能使用它
namespace std
{
template <>
struct std::hash<void (foo::*)(int)>
{
// Implement the class.
};
}
名称空间std
{
模板
struct std::hash
{
//实现这个类。
};
}
使用它
int main(){
std::hash<void (foo::*)(int)> hasher;
}
intmain(){
散列哈希器;
}
您必须先定义专门化,然后才能使用它
namespace std
{
template <>
struct std::hash<void (foo::*)(int)>
{
// Implement the class.
};
}
名称空间std
{
模板
struct std::hash
{
//实现这个类。
};
}
使用它
int main(){
std::hash<void (foo::*)(int)> hasher;
}
intmain(){
散列哈希器;
}
问题在于指向成员的指针不是真正的指针;他们只是碰巧有一个相似的名字和类似的语法std::hash
专门用于普通指针,但不用于指向成员的指针。你当然可以自己专门做,但如果有一种方法可以保证安全,我就看不到了;对于指向成员的指针,除了取消引用或将其强制转换为指向成员的其他指针之外,您没有什么可以做的。问题在于指向成员的指针不是真正的指针;他们只是碰巧有一个相似的名字和类似的语法std::hash
专门用于普通指针,但不用于指向成员的指针。你当然可以自己专门做,但如果有一种方法可以保证安全,我就看不到了;对于指向成员的指针,除了取消引用或将其强制转换为指向成员的其他指针之外,您没有什么可以做的。问题在于指向成员的指针不是真正的指针;他们只是碰巧有一个相似的名字和类似的语法std::hash
专门用于普通指针,但不用于指向成员的指针。你当然可以自己专门做,但如果有一种方法可以保证安全,我就看不到了;对于指向成员的指针,除了取消引用或将其强制转换为指向成员的其他指针之外,您没有什么可以做的。问题在于指向成员的指针不是真正的指针;他们只是碰巧有一个相似的名字和类似的语法std::hash
专门用于普通指针,但不用于指向成员的指针。你当然可以自己专门做,但如果有一种方法可以保证安全,我就看不到了;对于指向成员的指针,除了将其取消引用或强制转换为指向成员的其他指针之外,您没有什么可以做的。将结构声明更改为:
struct foo{
static void bar(int a){}
};
非静态成员函数有一个与this指针对应的隐藏参数,这就是编译器发生的原因。将结构声明更改为:
struct foo{
static void bar(int a){}
};
非静态成员函数有一个与this指针对应的隐藏参数,这就是编译器发生的原因。将结构声明更改为:
struct foo{
static void bar(int a){}
};
非静态成员函数有一个与this指针对应的隐藏参数,这就是编译器发生的原因。将结构声明更改为:
struct foo{
static void bar(int a){}
};
非静态成员函数有一个与this指针对应的隐藏参数,这就是编译器发生的原因。这一“实现类”掩盖了问题的难点-如何计算指向成员的指针的哈希值还很不清楚。@GeoffRomer,我同意。我也不确定OP是否知道如何实现这个类。我正在帮助解释编译器错误以及如何克服它。@R Sahu据我所知,没有定义良好的方法来获取指向成员的指针哈希。我只是(错误地)假设std::hash的指针专门化覆盖了它们。@Shokwav,也许这篇文章的答案会有所帮助。“实现类”掩盖了问题的难点——如何为指向成员的指针计算哈希值还很不清楚。@GeoffRomer,我同意。我也不确定OP是否知道如何实现这个类。我正在帮助解释编译器错误以及如何克服它。@R Sahu据我所知,没有定义良好的方法来获取指向成员的指针哈希。我只是(错误地)假设std::hash的指针专门化覆盖了它们。@Shokwav,也许这篇文章的答案会有所帮助。“实现类”掩盖了问题的难点——如何为指向成员的指针计算哈希值还很不清楚。@GeoffRomer,我同意。我也不确定OP是否知道如何实现这个类。我正在帮助解释编译器错误以及如何克服它。@R Sahu据我所知,没有定义良好的方法来获取指向成员的指针哈希。我只是(错误地)假设std::hash的指针专门化覆盖了它们。@Shokwav,也许这篇文章的答案会有所帮助。“实现类”掩盖了问题的难点——如何为指向成员的指针计算哈希值还很不清楚。@GeoffRomer,我同意。我也不确定OP是否知道如何实现这个类。伊娃