Определение шаблона позволяет создать функцию:
void Bar::foo<Impl>(Impl& t)
, что лучше, чем те, которые вы определили, которые принимают параметр Interface&
.
Вы должны сделатьфункция суперкласса лучше соответствует, возможно, так:
class Bar
{
struct fallback { fallback(int) {} };
template<typename T> void foo(T& t, fallback) {
std::cout << "generic\n";
}
void foo(Interface& t, int) {
std::cout << "overload\n";
}
public:
template<typename T> void foo(T& t) {
foo(t, 0);
}
};
Кажется, что на самом деле это не работает, см. http://ideone.com/IpBAv
Так что вам понадобится проверка типа внутри общеговерсия, ищет подклассы Interface
.