В случае, если кто-то еще сталкивается с подобной ошибкой / недоразумением, моя ошибка (точно указанная n. 'Местоимениями' m.) Использовала неправильный тип в has_serialize::test
. Из того, что я могу сделать (по своей наивности), это то, что для
template<typename T>
struct has_serialize
{
// ...
template<typename C>
static constexpr auto test(int)
-> decltype(std::declval<T>().serialize(std::declval<SerializerBase&>()), std::true_type());
// ...
};
шаблон C
не появляется в has_serialize::test
, и в результате G CC не предоставляет возможности для замены неудача. Следовательно, G CC пытается оценить std::declval<T>().serialize(...)
и, очевидно, выдает ошибку, когда T = std::vector<double>
. Если T
заменяется на C
в этой строке, то компилятор распознает это как ошибку подстановки и определяет подпись как неподходящую.
Более того, как указал Максим Егорушкин, существует вероятность того, что T::serialize
может возвращать определяемый пользователем тип, который перегружает operator,
. Чтобы уменьшить (хотя и очень маловероятно) потенциальную ошибку, код должен быть:
template<typename T>
struct has_serialize
{
// ...
template<typename C>
static constexpr auto test(int)
-> decltype(static_cast<void>(std::declval<C>().serialize(std::declval<SerializerBase&>())), std::true_type());
// ...
};