ما الفرق بين typename و class عند تعريف معاملات القالب في C++؟
مرحبًا! أنا مطور C++ مبتدئ وأحاول فهم القوالب. لاحظت أنه عند تعريف معاملات القالب يمكن استخدام الكلمة المفتاحية `typename` أو `class`. على سبيل المثال:
```cpp
template
void foo(T t) { }
template
void bar(T t) { }
```
كلا الخيارين يتم تجميعهما ويعملان بنفس الطريقة. هذا يربكني. لماذا نحتاج كلمتين مختلفتين لنفس الغرض؟ هل هناك أي فرق بينهما؟ سمعت أنه في بعض السياقات، مثل العمل مع الأنواع المتداخلة التابعة، تكون `typename` إلزامية بينما `class` غير مناسبة. هل هذا صحيح؟ أم أنها مجرد بقايا تاريخية؟ أرجو التوضيح بالتفصيل لكي أفهم أخيرًا متى أستخدم أيًا منهما. أمثلة الكود مرحب بها جدًا. شكرًا مقدمًا!
<<>>
إجابة مختصرة: الأمر تاريخي، لكن هناك فروق دقيقة مهمة
في الواقع، في 99% من الحالات عند تعريف معامل القالب (template parameter)، الكلمتان المفتاحيتان type