Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法对指向成员的指针使用std::hash的专门化?_C++_Hash_Stdhash - Fatal编程技术网

C++ 无法对指向成员的指针使用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{ 空条

我假设std::hash对泛型指针类型的专门化可以用于指向成员的指针,但是我不能这样使用它;相反,我的编译器给了我一个“不完整类型”错误,我认为这意味着“没有对指针使用std::hash的专门化?”?这是怎么回事

#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是否知道如何实现这个类。伊娃