gpt4 book ai didi

c++ - 为模板类嵌套类定义 std::hash 的编译错误

转载 作者:行者123 更新时间:2023-11-30 02:27:02 28 4
gpt4 key购买 nike

我有一个类:

namespace App
{

template<typename A, typename B>
class MyClass
{
//...
class NestedClass
{
//...
}
}

} //namespace App

我想为 NestedClass 定义一个 std::hash

//Definition of hash functions
namespace std
{
//Definition of a hash to use generic pairs as key
template<typename A, typename B>
struct hash<App::MyClass<A,B>::NestedClass>
{
public:
size_t operator()(const App::MyClass<A,B>::NestedClass &it) const
{
return std::hash(it.toInt());
}
};
}

我得到错误:

source.h:1166: error: type/value mismatch at argument 1 in template parameter list for 'template<class _Tp> struct std::hash'
struct hash<App::MyClass<A,B>::const_NestedClass>
^

有什么想法吗?谢谢!

最佳答案

您可以通过添加 typename 来修复您的错误在适当的地方通知编译器 :: 后面的符号确实是一种类型:

template<typename A, typename B>
struct hash<typename App::MyClass<A, B>::NestedClass>
{// ^^^^^^^^
public:
size_t operator()(const typename App::MyClass<A,B>::NestedClass &it) const
// ^^^^^^^^
{
return hash(it.toInt());
}
};

现在你得到一个新的错误:

prog.cc:22:12: error: class template partial specialization contains template parameters that cannot be deduced; this partial specialization will never be used [-Wunusable-partial-specialization]
struct hash<typename App::MyClass<A, B>::NestedClass>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.cc:21:23: note: non-deducible template parameter 'A'
template<typename A, typename B>
^
prog.cc:21:35: note: non-deducible template parameter 'B'
template<typename A, typename B>

编译器不可能推导出AB在这种情况下,因为不能保证 NestedClass存在于所有 MyClass<A, B>实例化。更多信息:

假设 NestedClass,您可能可以解决这个问题存在并散列 MyClass<A, B>反而。提供一些访问方式 NestedClass来自 MyClass你将能够写出这样的东西:

template<typename A, typename B>
struct hash<typename App::MyClass<A, B>>
{
public:
size_t operator()(const typename App::MyClass<A,B> &it) const
{
return hash(it.nested.toInt());
}
};

关于c++ - 为模板类嵌套类定义 std::hash 的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42158119/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com