Строка, содержащая имя типа, не совпадает с типом. Первый существует только во время выполнения, а последний существует только во время компиляции.
Что вы можете сделать, это добавить псевдоним типа к a
, который можно передать в другой шаблон:
template <typename T>
struct a {
using value_type = T;
//...
};
int main() {
a<int> obj1;
// Later
a<decltype(obj1)::value_type> obj2;
}
Live Demo
Если вы не можете изменить класс a
по какой-либо причине, вы можете использовать частичную специализацию шаблона для извлечения правильного типа:
template <typename T>
struct a_traits {};
template <typename T>
struct a_traits<a<T>> {
using value_type = T;
};
int main() {
a<int> obj1;
// Later
a<a_traits<decltype(obj1)>::value_type> obj2;
}
Live Demo
Конечно, если вы объявляете второй объект точно такого же типа, вам не нужно делать ни одну из этих вещей. Вы можете просто использовать decltype
:
int main() {
a<int> obj1;
// Later
decltype(obj1) obj2;
}
Live Demo