Компиляции этого кода:Неоднозначный вызов не избежать SFINAE
#include <iostream>
template <int N>
struct TestClass {
template <int N2, typename std::enable_if<N2 == N, int>::type = 0>
void doAction() { std::cout << "TestClass::doAction<" << N << ">();\n"; }
};
struct HostClass : public TestClass<1>, public TestClass<2> {
};
int main(int argc, const char * argv[]) {
HostClass hostClass;
hostClass.doAction<1>();
hostClass.doAction<2>();
return 0;
}
приводит к неоднозначной ошибке вызова, потому что doAction
одновременно в TestClass<1>
и TestClass<2>
родительских классах.
main.cpp: 33: 15: УЧАСТНИК DoAction "находится в нескольких базовых классах различных типов
Но std::enable_if
не отключит эту неоднозначность?
EDIT:
Я думаю, что реальная причина этой неоднозначности является тем же, чем в этом вопросе:
Неоднозначность может быть решена, как показано в ответ с using
ключевое слово:
#include <iostream>
template <int N>
struct TestClass {
template <int N2, typename std::enable_if<N2 == N, int>::type = 0>
void doAction() { std::cout << "TestClass::doAction<" << N << ">();\n"; }
};
struct HostClass : public TestClass<1>, public TestClass<2> {
using TestClass<1>::doAction;
using TestClass<2>::doAction;
};
int main(int argc, const char * argv[]) {
HostClass hostClass;
hostClass.doAction<1>(); // OK, compile
hostClass.doAction<2>(); // OK, compile
//hostClass.doAction<3>(); // OK, doesn't compile : "candidate template ignored: disabled by 'enable_if' [with N2 = 3]"
return 0;
}
Я не знаю, было ли это wh в ответе @skypjack, но я все равно допустил его альтернативный метод.
Для большей наглядности добавить, что 'TestClass <1> :: doAction' и' TestClass <2> :: doAction' две разные функции, и а не перегрузки одной и той же функции, общий источник недоразумений. –
@ Peregring-lk Done. Благодарю. – skypjack