具有不同概念的模板 class 专业化给出重新定义错误
Template class specialization with different concepts gives redefinition error
我正在使用 std::hash
和 Hashable
概念编写一些代码。但是,我无法用两个不同的概念定义专业化,即使我没有它们的模糊实例。
#include <ranges>
#include <concepts>
#include <functional>
namespace ranges = std::ranges;
template <typename T>
concept Hashable = requires(const T& t) {
{ std::hash<T>{}(t) } -> std::convertible_to<size_t>;
};
template <typename T>
concept HashableWithMember = requires(const T& t) {
{ t.Hash() } -> std::convertible_to<size_t>;
};
template <typename R>
concept HashableRange = ranges::range<R> && Hashable<ranges::range_value_t<R>>;
template <HashableWithMember T>
struct std::hash<T> {
size_t operator()(const T& t) const { return t.Hash(); }
};
template <HashableRange R>
struct std::hash<R> {
size_t operator()(const R& r) const {
return 0;
}
};
template <Hashable T>
static size_t Hash(const T& t) {
return std::hash<T>{}(t);
}
<source>:26:13: error: redefinition of 'struct std::hash<_Tp>'
26 | struct std::hash<R> {
| ^~~~~~~
<source>:21:13: note: previous definition of 'struct std::hash<_Tp>'
21 | struct std::hash<T> {
| ^~~~~~~
https://godbolt.org/z/1roj1qMbs
如果 class 既是 HashableRange
又是 HashableWithMember
,我会理解这个错误,但没有。为什么这不起作用?
这是已知的 GCC 错误 [concepts] redefinition error when using constrained structure template inside namespace
:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92944
更简单的例子如下:
#include <concepts>
#include <functional>
template <std::convertible_to<int> T>
struct std::hash<T> {};
template <std::convertible_to<float> U>
struct std::hash<U> {};
Clang 和 MSVC 都可以,错误仅存在于 GCC。演示:https://gcc.godbolt.org/z/Warhfaf7q
我正在使用 std::hash
和 Hashable
概念编写一些代码。但是,我无法用两个不同的概念定义专业化,即使我没有它们的模糊实例。
#include <ranges>
#include <concepts>
#include <functional>
namespace ranges = std::ranges;
template <typename T>
concept Hashable = requires(const T& t) {
{ std::hash<T>{}(t) } -> std::convertible_to<size_t>;
};
template <typename T>
concept HashableWithMember = requires(const T& t) {
{ t.Hash() } -> std::convertible_to<size_t>;
};
template <typename R>
concept HashableRange = ranges::range<R> && Hashable<ranges::range_value_t<R>>;
template <HashableWithMember T>
struct std::hash<T> {
size_t operator()(const T& t) const { return t.Hash(); }
};
template <HashableRange R>
struct std::hash<R> {
size_t operator()(const R& r) const {
return 0;
}
};
template <Hashable T>
static size_t Hash(const T& t) {
return std::hash<T>{}(t);
}
<source>:26:13: error: redefinition of 'struct std::hash<_Tp>'
26 | struct std::hash<R> {
| ^~~~~~~
<source>:21:13: note: previous definition of 'struct std::hash<_Tp>'
21 | struct std::hash<T> {
| ^~~~~~~
https://godbolt.org/z/1roj1qMbs
如果 class 既是 HashableRange
又是 HashableWithMember
,我会理解这个错误,但没有。为什么这不起作用?
这是已知的 GCC 错误 [concepts] redefinition error when using constrained structure template inside namespace
:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92944
更简单的例子如下:
#include <concepts>
#include <functional>
template <std::convertible_to<int> T>
struct std::hash<T> {};
template <std::convertible_to<float> U>
struct std::hash<U> {};
Clang 和 MSVC 都可以,错误仅存在于 GCC。演示:https://gcc.godbolt.org/z/Warhfaf7q