Я пытаюсь удалить функцию-член в зависимости от типа шаблона.Проблема состоит в том, чтобы более поздняя специализация шаблона соответствовала сигнатуре типа моей функции в случае, если она не удалена.
Я попробовал следующий код, который компилируется с GCC (9.0.1), но выдает ошибкув Clang (9.0.0).Я думаю, что также не удается построить код в MSVC ++.
#include <type_traits>
#include <iostream>
template <typename T>
struct my_type {
template <typename Q = T>
std::enable_if_t<!std::is_same<bool, Q>::value, my_type<T>> my_fun(const my_type<T>& v) {
std::cout << "Base";
return v;
}
};
template <>
template <typename Q>
std::enable_if_t<!std::is_same<bool, double>::value, my_type<double>> my_type<double>::my_fun(const my_type<double>& v) {
std::cout << "Specialized";
return v;
}
int main()
{
my_type<double> aa, bb;
aa.my_fun(bb);
}
Ошибка с Clang:
prog.cc:16:88: error: out-of-line definition of 'my_fun' does not match any declaration in 'my_type<double>'
std::enable_if_t<!std::is_same<bool, double>::value, my_type<double>> my_type<double>::my_fun(const my_type<double>& v) {
^~~~~~
1 error generated.
Я хотел бы знать, как заставить код работать, а также, почему результаты не согласованы между всеми основными компиляторами.