ווקטור בתור class member.

selalerer

New member
ווקטור בתור class member.

ניסיתי להגדיר vector של פוינטרים בתוך מחלקה כך:
#include <vector> #include "receiver.h" class accepter { //.... vector<receiver *> receivers; //... };​
וGCC נותן לי את טעויות האלו על השורה הזאת:
error: ISO C++ forbids declaration of `vector' with no type error: expected `;' before '<' token​
מה אני צריך לחפש פה? מה הבעיה? תודה, סלע.
 

selalerer

New member
חשבתי שהראיתי את כל הקוד הרלוונטי.

אבל הנה יותר מפורט אם זה עוזר. accepter.h:
#ifndef ACCEPTER #define ACCEPTER // c++/STL headers: #include<vector> // Linux headers: #include<pthread.h> // This application headers: #include "receiver.h" //Accepts new connection and creates for each one of them a receiver object to // handle the communication. class accepter { private: static void *threadFunc(void *args);//thread function. pthread_t threadId;//thread id . bool mQuit;//quiting flag. int sd;//Socket file descriptor. sockaddr_in addr; short port; unsigned int maxClients; vector<receiver *> receivers; public: accepter(unsigned int maxClients=5,short port=1501); ~accepter(); void quit(); bool isQuit(); void waitQuit(); int receiversCount(); }; #endif​
receiver.h:
#ifndef RECEIVER #define RECEIVER //system (Linux) headers: #include <pthread.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> class receiver { private: static const int bufferSize=256; static void *threadFunc(void *args); pthread_t threadId; bool mQuit; int sd;//Scoket file descriptor. sockaddr_in clientAddr; public: receiver(int sd,sockaddr_in clientAddr); ~receiver(); bool isQuit(); void quit(); void waitQuit(); }; #endif​
תודה, סלע.
 

vinney

Well-known member
הנה מה כתוב בMSDN

C++ language change: to explicitly specialize class template 'identifier' use the following syntax: In order to explicitly specialize a template class, use the new syntax. For example: template<class T> class X {}; template<> class X<int> {} //New syntax: explicitly specialize X class X<char> {}; //old way - now illegal​
יעני אם אתה משתמש בTEMPLATE בתוך המחלקה, היא עצמה צריכה להיות TEMPLATE... בVS זה WARNING ברמה 4 (יעני זניח), אבל זה יתן שגיאה אם אני אשים אופציית תמיכה בISO (זה Za/).
 

selalerer

New member
אבל למה?

ברגע שאני מכריז על:
vector<receiver *>​
אז הוא פורס את המחלקה הזאת (שם את הטקסט ומחליף את T ב * receiver) אז מה הבעיה שאני אצור מופע של המחלקה הזאת בתוך מחלקה. לא לעשות את זה שומט לי את היכולת להשתמש בtemplates כאבני בניין למחלקות שלי, או בעברית, דופק לי את היכולת לבנות את התוכנה שלי באופן מודולרי.
 

vinney

Well-known member
מאיפה לי לדעת...

זה מה שכתבו בסטנדרט... האמת אני די מופתע, אני משתמש בזה מדי פעם, ולא נתקלתי בהודעה הזאת (כי אני לא מוריד את הסוויטץ' הזה של הVS, כנראה
), GCC ידוע כיותר תקני, אז הרי לך קיבלת
 

annefan

New member
מאיפה הבאת את זה??

אתה עובד אולי, לגמרי בלי כוונה, עם VC6? הקומפיילר הזה שכל מה שקשור ל-templates הוא מקיא עליו?? הקוד של סלע תקין לחלוטין. הנה קוד דומה, אם הבנתי אותו נכון:
#include <vector> class A { public: std::vector<int> vi; std::vector<int *> vpi; }; int main() { A a; a.vi.push_back(1); int i = 3; a.vpi.push_back(&i); return 0; }​
עובר קומפילציה ולינק ב-VS.NET2003 וב-++g בלי בעיות.
 

vinney

Well-known member
ברור שVC6

הקוד המקורי שהוא שלח גם התקמפל, רק נתן את האזהרה הזאת (שהיא ברמה 4, כך שמבחינתי די זניחה), ואגב - עם או בלי STD! (שזה אני מודה די מוזר). אני משתמש בקוד כזה (כמו בדוגמא שלך) די הרבה, לכן לא ברור לי פשר ההודעה הזאת גם, ואני עובד הרבה בVC6, ולפעמים עם gcc (כיש מעבד שהוא תומך בו).
 

annefan

New member
לכן זו לא הבעיה

(הבעיה היתה, אם אני מבין נכון שהוא לא כתב using). לגבי VC6, הסביבה שלו מעולה, והוא היה לא רע לזמנו. הוא מאוד מאוד מאוד לא סטנדרטי, בייחוד בפינות של השפה, כלומר templates וצפונה. יש לו שגעונות עם כל מיני צירופים של מחלקות ותבניות. ככה שזה שהוא לא למקמפל משהו, זה לא אומר שככה כותב הסטנדרט. ++g בודאי ה-3.3+ סטנדרטיים מאוד, וכמובן שאין על VS.NET.
 

vinney

Well-known member
אבל הציטוט שהבאתי הוא מMSDN

לא מVC, ומדבר שם דווקא על הסטנדט, וזה בדיוק אותה הודעה שהוא קיבל בGCC, רק שבGCC זו שגיאה ובVC - אזהרה
 

annefan

New member
שני דברים

א. MSDN הוא לא הסטנדרט. הוא מה שמיקרוסופט רוצה שתחשוב שהוא הסטנדרט. ב. אני לא מצליח להבין את הקשר בין הקוד של סלע, לבין הציטוט שלך מה-MSDN. ה-MSDN עוסק ב-Class Tempalte Specialization, כלומר מה קורה כשיש לך Class Template לרוב המקרים, ולמקרה מסוים (של סוג המשתנה, נאמר) אתה רוצה לתת טיפול אחר. קוד של סלע עוסק ב-member שהוא עצמו tempalte.
 

vinney

Well-known member
נו שוין

לא משנה, עזוב אותך שטויות אני לא מתייחס לMSDN כסטנדרט, אבל לזכותם של מייקרוסופט יאמר שכל מה שלא בסטנדרט מצוין שם בפירוש, כך שכשכתוב שם שמשהו הוא סטנדרטי - אין לי סיבה לחשוב שזה לא.
 

desertboy

New member
פשוט מאוד

המחלקה וקטור שייכת ל namespace std , ללא ציון ה std הקומפיילר לא מכיר את הוקטור שציינת ולכן הוא צועק עליך .
 

voguemaster

New member
תקן אותי אם אני טועה

אבל אפשר להכליל את vector בקובץ ה-HEADER ובקובץ ה-CPP להשתמש ב-using namespace std ממתי יש צורך לכתוב במפורש std::vector ? משהו פה עקום...
 

DadleFish

New member
זה עקום -

אם אתה מכליל את vector בתוך ה-header, אז או שתכתוב שם מייד using (שזה מאוד מאוד לא בסדר), או שתשתמש בשם ה-namespace בהגדרת המשתנה.
 

desertboy

New member
אפשרי בתנאי ש

את ההצהרה של using namespace std שמי לפני הכללה של ה header מה שיכול לגרום לבעיות מחוסר צומ לב / ידע , מעבר לזה יש גם עניין של טעם אני מעדיף להגדיר על std::vector.
 

voguemaster

New member
הממ.. לא בדיוק אחשלו

יש לי קוד שעובד ומתקמפל ובו אני מכליל את vector ואחרים לפני שאני משתמש ב-using. מה שכן, כל ההגדרות המבוססות על string ו-vector באות אח"כ כלומר אין מצב שאני מגדיר וקטור של טיפוס מסוים לפני שאני מבצע הכללה של vector ו-using. כן, לדעתי זה קצת עקום שהפיתרון הכי קל הוא להשתמש ב-using בקובץ header (אפילו אם זה קובץ header יחיד לדוגמא..)
 
למעלה