К сожалению, вывод аргументов шаблона работает только в непосредственном контексте, и иначе было бы нелогично поступать иначе. Подумайте об этом примере:
template<typename T>
using common_base = std::conditional<(sizeof(T) > 8), int, float>
template<typename T>
void call_me(common_base<T>) {
// ...
}
int main() {
call_me(1.4f); // What is T?
}
Это может показаться очевидным, но это также и то, что происходит с вашим примером. Вы можете себе представить это:
// Ah! Fooled you compiler!
template<> struct B<int> { using HERE = B<std::string>; };
Затем, после чего, что эти вызовы должны выводить?
CheckMe(bi); // should deduce B<int> or B<std::string>?
Как вы можете видеть, компилятор не может вывести через не непосредственный контекст, так какможет не быть отношения 1: 1, а иногда оно просто не может быть вычтено.
Что делать тогда?
Упрощение функции шаблона - это обычный способ сделатьэто работает:
template<typename T>
struct B {
using HERE = B<T>;
using type = T;
};
template<typename BaseType>
void CheckMe(BaseType* bt) {
using VAR_TYPE = BaseType::type; // yay, can use member type
}