שאלת ++C

zagzagzag

New member
שאלת ++C

נניח שיש לי template כזה:
template <char *str> class C { public: C() : name(str) {}; char *getName() { return name; } private: char *name; };​
ואת הקוד הבא:
char str[] = "str"; int main() { C<str> c1; C<"str"> c2; }​
מתוך שתי השורות ב-main, הראשונה מתקמפלת והשנייה לא. השגיאה שמתקבלת מהקומפיילר (GCC 3.3):
error: string literal "str" is not a valid template argument because it is the address of an object with static linkage​
אני לא כ"כ מבין את השגיאה הזו, כי עד כמה שאני יודע, בזמן קומפילציה הכתובת של המחרוזת השנייה אמורה להיות מוכרת לקומפיילר. אם מישהו יוכל לעשות קצת סדר בבלאגן אני אשמח.
 

vinney

Well-known member
המם... מה?

לא ברור לי למה אתה מגדיר template עבור טיפוס נתונים ספציפי, זה סתור את כל הרעיון... אתה משתמש בtemplate במקום constructor? מה אתה מנסה לעשות? "str" לא מייצג שום טיפוס נתונים, זה רצף סטטי בזכרון, שהקומפיילר מתקשה לאפיין, משם השגיאה.
 

annefan

New member
הוא אומר לך מה הבעיה

הבעיה היא שיש לך argument עם internal linkage - כלומר אותה מחרוזת תהיה שונה בין שתי יחידות קומפילציה. מחרוזת כזו לא יכולה להיות פרמטר ל-template. אתה יכול לקרוא ב-C++ Templates: The Complete Guide בפרק 4.3 ו-13.4.
 
למעלה