Skip to content

Commit 42cfcb6

Browse files
committed
fix: msvc compile error where template overload gets eliminated incorrectly
Specifically it fails to consider a dependent type for overload resolution even when the template parameter it's dependent on is specified explicitly. So we're using enable_if-based SFINAE instead now to check for the presence of a `value_type` member type in `T`.
1 parent 8b0d870 commit 42cfcb6

File tree

2 files changed

+38
-10
lines changed

2 files changed

+38
-10
lines changed

include/frozen/set.h

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -252,18 +252,31 @@ constexpr auto make_set(std::array<T, N> const &args, Compare const& compare = C
252252
return set<T, N, Compare>(args, compare);
253253
}
254254

255-
template <typename T, typename Compare, std::size_t... Ns,
256-
std::enable_if_t<!std::is_array<Compare>::value>* = nullptr>
255+
template <
256+
typename T
257+
, typename Compare
258+
, typename ElemT
259+
, std::enable_if_t<
260+
!std::is_array<Compare>::value
261+
&& std::is_same<ElemT, typename T::value_type>::value
262+
, std::size_t>... Ns
263+
>
257264
constexpr auto make_set(
258265
Compare const& compare,
259-
const typename T::value_type (&... values)[Ns]) {
266+
const ElemT (&... values)[Ns]) {
260267
constexpr const auto storage_size = bits::accumulate({Ns...});
261268
using container_type = bits::pic_array<T, sizeof...(Ns), storage_size>;
262269
return set<T, sizeof...(Ns), Compare, container_type>{container_type{values...}, compare};
263270
}
264271

265-
template <typename T, std::size_t... Ns>
266-
constexpr auto make_set(const typename T::value_type (&... values)[Ns]) {
272+
template <
273+
typename T
274+
, typename ElemT
275+
, std::enable_if_t<
276+
std::is_same<ElemT, typename T::value_type>::value
277+
, std::size_t>... Ns
278+
>
279+
constexpr auto make_set(const ElemT (&... values)[Ns]) {
267280
return make_set<T>(std::less<T>{}, values...);
268281
}
269282

include/frozen/unordered_set.h

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,20 +176,35 @@ constexpr auto make_unordered_set(std::array<T, N> const &keys, Hasher const& ha
176176
return unordered_set<T, N, Hasher, Equal>{keys, hash, equal};
177177
}
178178

179-
template <typename T, typename Hasher, typename Equal, std::size_t... Ns,
180-
std::enable_if_t<!std::is_array<Hasher>::value && !std::is_array<Equal>::value>* = nullptr>
179+
template <
180+
typename T
181+
, typename Hasher
182+
, typename Equal
183+
, typename ElemT
184+
, std::enable_if_t<
185+
!std::is_array<Hasher>::value
186+
&& !std::is_array<Equal>::value
187+
&& std::is_same<ElemT, typename T::value_type>::value
188+
, std::size_t>... Ns
189+
>
181190
constexpr auto make_unordered_set(
182191
Hasher const& hash,
183192
Equal const& equal,
184-
const typename T::value_type (&... values)[Ns])
193+
const ElemT (&... values)[Ns])
185194
{
186195
constexpr const auto storage_size = bits::accumulate({Ns...});
187196
using container_type = bits::pic_array<T, sizeof...(Ns), storage_size>;
188197
return unordered_set<T, sizeof...(Ns), Hasher, Equal, container_type>{container_type{values...}, hash, equal};
189198
}
190199

191-
template <typename T, std::size_t... Ns>
192-
constexpr auto make_unordered_set(const typename T::value_type (&... values)[Ns]) {
200+
template <
201+
typename T
202+
, typename ElemT
203+
, std::enable_if_t<
204+
std::is_same<ElemT, typename T::value_type>::value
205+
, std::size_t>... Ns
206+
>
207+
constexpr auto make_unordered_set(const ElemT (&... values)[Ns]) {
193208
return make_unordered_set<T>(elsa<T>{}, std::equal_to<T>{}, values...);
194209
}
195210

0 commit comments

Comments
 (0)