带有可变参数模板的标准散列

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<>,您的偏特化语法是正确的。