带有可变参数模板的标准散列
Standard hash with variadic template
我有以下代码:
namespace foo {
template<typename ...Types>
class Pi {
};
}
namespace std {
template<> //line offending gcc 8.3.1
template<typename ...Types>
struct hash<foo::Pi<Types...>> {
std::size_t operator()( const foo::Pi<Types...>& s ) const noexcept {
return 0;
}
};
}
int main() {
return 0;
}
在使用 gcc 8.3.1 时,我收到了太多参数模板参数列表的错误,而在使用 gcc 4.8.3 时它可以正常工作。如果我删除上面的注释行,它是否有效?
较新的 GCC 版本是正确的。
template<>
在这里不是有效语法。它仅用于模板的显式特化。
您在这里所做的是部分 std::hash
的特化,因为您不是只针对一种特定类型,而是可以从 foo::Pi
。如果没有 template<>
,您的偏特化语法是正确的。
我有以下代码:
namespace foo {
template<typename ...Types>
class Pi {
};
}
namespace std {
template<> //line offending gcc 8.3.1
template<typename ...Types>
struct hash<foo::Pi<Types...>> {
std::size_t operator()( const foo::Pi<Types...>& s ) const noexcept {
return 0;
}
};
}
int main() {
return 0;
}
在使用 gcc 8.3.1 时,我收到了太多参数模板参数列表的错误,而在使用 gcc 4.8.3 时它可以正常工作。如果我删除上面的注释行,它是否有效?
较新的 GCC 版本是正确的。
template<>
在这里不是有效语法。它仅用于模板的显式特化。
您在这里所做的是部分 std::hash
的特化,因为您不是只针对一种特定类型,而是可以从 foo::Pi
。如果没有 template<>
,您的偏特化语法是正确的。