завершается ошибкой, если T не имеет конструктора по умолчанию, даже если A () не вызывается.
class X
{
public:
X(int) {}
};
template <class T>
class A: public T
{
public:
A(): T() {}
template <class U>
A(const U& u): T(u) {}
};
int main()
{
A<X> a(1);
//A<X> b;
}
Похоже, что он хорошо компилируется с несколькими компиляторами.Разве это не намерение шаблонов классов в том, что неиспользуемые методы не вызывают ошибок с определенным параметром шаблона, если они не используются на самом деле?
Возможно, конструктор по умолчанию для A вызывается где-нибудь в конце концов?
Стандарт имеет этот пример, чтобы проиллюстрировать, как создаются шаблон класса и функции-члены.Обратите внимание, что создание экземпляров класса и членов разделено:
-3- [Пример:
template<class T> class Z {
public:
void f();
void g();
};
void h()
{
Z<int> a; // instantiation of class Z<int> required
Z<char>* p; // instantiation of class Z<char> not
// required
Z<double>* q; // instantiation of class Z<double>
// not required
a.f(); // instantiation of Z<int>::f() required
p->g(); // instantiation of class Z<char> required, and
// instantiation of Z<char>::g() required
}
Ничто в этом примере не требует класса Z, Z :: g () илиZ :: f () должен быть создан неявно.]
Насколько я понимаю, это подразумевает, что не только "лениво" создаются экземпляры не только методов шаблона в шаблоне класса, но и обычные члены.