Рассмотрим следующий код:
template <typename T>
class Object
{
public:
using p1 = unique_ptr<Object>;
using p2 = unique_ptr<Object<T>>;
// ...
};
Подскажите, пожалуйста, есть ли разница между p1 и p2?
Да никакого. Это просто разная запись одного и того же.
Можете убедиться:
void out()
{
cout << typeid(p1).name() << endl;
cout << typeid(p2).name() << endl;
}
дает один и тот же тип.
Ну, или используйте is_same.
Шаблон класса позволяет задать тип для объектов, используемых в классе, это не влияет на имя класса. Поэтому для шаблоннного класса:
template <class T>
class Object {
T a;
public:
Object<T>(const T k) : a(k) {}
Object(const T k) : a(k) {}
};
Имя Object и Object<T> идентичны в пределах этой же специализации, и тут присутствует двойное определение одного и того же конструктора
Сборка персонального компьютера от Artline: умный выбор для современных пользователей