أين ولماذا تحتاج إلى وضع الكلمتين المفتاحيتين template و typename في لغة C++؟
مرحبًا أيها الزملاء! لقد كنت أكتب بلغة C++ لعدة أشهر، لكن القوالب لا تزال تسبب لي الصداع. خاصة أن الكلمتين المفتاحيتين `template` و `typename` تربكانني. أفهم أنهما مرتبطتان بطريقة ما بالأسماء التابعة (dependent names)، لكن في الممارسة العملية أحصل باستمرار على أخطاء في الترجمة.
إليك مثال محدد حيرني. لنفترض أن لدي فئة قالب حاوية، وأريد كتابة دالة تطبع العناصر من نوع المكرر (iterator) المتداخل:
```cpp
#include
#include
template
void printFirst(const T& container) {
T::const_iterator it = container.begin(); // خطأ!
std::cout << *it << std::endl;
}
int main() {
std::vector vec = {1, 2, 3};
printFirst(vec);
return 0;
}
```
المترجم (GCC) يعطي: `error: need 'typename' before 'T::const_iterator' because 'T' is a dependent scope`. أضع `typename` — ويختفي الخطأ. لكن عندما أحاول فعل شيء مشابه مع قالب متداخل،