Этот код имеет две проблемы:
- При вызове
bEn1.test();
или bEn2.test();
компилятор выяснит, что имя test
относится к функции в классе B
и множеству перегруженныхфункции будут включать только B::test
.Это можно исправить, перенеся имя из базового класса в производный класс:
template<EN T1> class B : public Base{
public: using Base::test;
Однако теперь не шаблонная функция будет предпочтительнее шаблонной функции (даже когда
enable_if
работает), поэтому
B<EN2> bEn2; bEn2.test();
выведет 1.
Чтобы снова выполнить эту работу, вы можете ввестиеще одна перегрузка, аналогичная первой в первом примере, которая будет вызывать функцию из базового класса вместо того, чтобы вносить имя Base::test
в производный класс:
public: template<EN enLocal=T1>
std::enable_if_t< enLocal!=EN2,void > test(){
return Base::test();
}
Еще один возможный обходной путь в стиле C ++ 17 с использованием if constexpr
вместо черт типа или SFINAE:
public: template<EN enLocal = T1> void
test()
{
if constexpr(EN2 == enLocal)
{
std::cout<<"2"<<std::endl;
}
else
{
Base::test();
}
}