§¬§Ñ§Ü §á§à§Õ§â§å§Ø§Ú§ä§î§ã§ñ §ã §ê§Ñ§Ò§Ý§à§ß§ß§í§Þ§Ú §á§Ñ§â§Ñ§Þ§Ö§ä§â§Ñ§Þ§Ú §®§ï§ä§î§ð §µ§Ú§Ý§ã§à§ß (Matthew Wilson) §Ó §ã§Ó§à§Ö§Û §ã§ä§Ñ§ä§î§Ö "§¥§â§å§Ø§Ö§ã§ä§Ó§Ö§ß§ß§í§Ö §º§Ñ§Ò§Ý§à§ß§í" (Friendly Templates) §Ü§à§ä§à§â§å§ð §Ó§í §Þ§à§Ø§Ö§ä§Ö §ß§Ñ§Û§ä§Ú §Ó §à§â§Ú§Ô§Ú§ß§Ñ§Ý§Ö §á§à §Ñ§Õ§â§Ö§ã§å http://www.cuj.com/documents/s=8943/cujexp0312wilson2/ §â§Ñ§ã§ã§Ü§Ñ§Ù§Ñ§Ý §à §ä§à§Þ, §Ü§Ñ§Ü §Ú§ã§á§à§Ý§î§Ù§à§Ó§Ñ§ä§î §ê§Ñ§Ò§Ý§à§ß§ß§í§Ö §á§Ñ§â§Ñ§Þ§Ö§ä§â§í §Ó §à§Ò§ì§ñ§Ó§Ý§Ö§ß§Ú§Ú §Õ§â§å§Ù§Ö§Û §Ü§Ý§Ñ§ã§ã§à§Ó. §¦§Ô§à §ã§ä§Ñ§ä§î§ñ §á§à§ã§Ý§å§Ø§Ú§Ý§Ñ §ä§à§Ý§é§Ü§à§Þ §Õ§Ý§ñ §ß§Ö§Ü§à§ä§à§â§í§ç §Ú§ß§ä§Ö§â§Ö§ã§ß§í§ç C++ §â§Ö§ê§Ö§ß§Ú§Û. §¯§Ú§Ø§Ö §á§â§Ö§Õ§ã§ä§Ñ§Ó§Ý§Ö§ß §á§Ö§â§Ö§Ó§à§Õ §ã§ä§Ñ§ä§î§Ú §®§ï§ä§î§ð (§ß§Ö§Þ§ß§à§Ô§à §Ý§Ú§ê§ß§Ö§Û §Ú§ß§æ§à§â§Þ§Ñ§è§Ú§Ú §ñ §å§Ò§â§Ñ§Ý, §à§Õ§ß§Ñ§Ü§à §Ó§Ñ§Ø§ß§Ñ§ñ §Ú§ß§æ§à§â§Þ§Ñ§è§Ú§ñ §à§ä §ß§Ñ§é§Ñ§Ý§Ñ §Ú §Õ§à §Ü§à§ß§è§Ñ §á§â§Ö§Õ§ã§ä§Ñ§Ó§Ý§Ö§ß§Ñ §Ó §á§à§Ý§ß§à§Þ §à§Ò§ì§Ö§Þ§Ö) §Ú §Þ§à§Ú §Ú§ã§á§â§Ñ§Ó§Ý§Ö§ß§Ú§ñ/§Õ§à§á§à§Ý§ß§Ö§ß§Ú§ñ. §³§ä§Ñ§ä§î§ñ §®§ï§ä§î§ð §µ§Ú§Ý§ã§à§ß§Ñ. §ª§ß§à§Ô§Õ§Ñ §Ó§à§Ù§ß§Ú§Ü§Ñ§ð§ä §ã§Ú§ä§å§Ñ§è§Ú§Ú, §Ü§à§Ô§Õ§Ñ §ß§Ö§à§Ò§ç§à§Õ§Ú§Þ§à §à§Ò§ì§ñ§Ó§Ú§ä§î §Õ§â§å§Ô§Ñ §Ü§Ý§Ñ§ã§ã§Ñ, §à§Õ§ß§Ñ§Ü§à §Ö§Ô§à §ä§Ú§á §á§â§Ö§Õ§ã§ä§Ñ§Ó§Ý§Ö§ß §Ó §Ó§Ú§Õ§Ö §ê§Ñ§Ò§Ý§à§ß§ß§à§Ô§à §á§Ñ§â§Ñ§Þ§Ö§ä§â§Ñ. §¯§Ñ§á§â§Ú§Þ§Ö§â: // §±§â§Ú§Þ§Ö§â #1 template class Thing { friend T; // §²§Ñ§Ù§â§Ö§ê§Ñ§Ö§ä §Ü§Ý§Ñ§ã§ã§å T §Õ§à§ã§ä§å§á §Ü§à §Ó§ã§Ö§Þ §Õ§Ñ§ß§ß§í§Þ §Ú §Þ§Ö§ä§à§Õ§Ñ§Þ §Õ§Ñ§ß§ß§à§Ô§à §Ü§Ý§Ñ§ã§ã§Ñ. private: int value_; }; §£§í§Ô§Ý§ñ§Õ§Ú§ä §Ó§á§à§Ý§ß§Ö §â§Ñ§Ù§å§Þ§ß§à, §ß§Ö §ä§Ñ§Ü §Ý§Ú? §¯§à §ï§ä§à §ß§Ö §ã§ä§Ñ§ß§Õ§Ñ§â§ä§ß§í§Û C++. §£ §ã§ä§Ñ§ß§Õ§Ñ§â§ä§Ö §ñ§Ù§í§Ü§Ñ C++ (§Õ§à§Ü§å§Þ§Ö§ß§ä C++-98 Standard (ISO/IEC 14882)), §á§å§ß§Ü§ä 7.1.5.3(2) §ã§Ü§Ñ§Ù§Ñ§ß§à, §é§ä§à §Ó§ß§å§ä§â§Ú §ê§Ñ§Ò§Ý§à§ß§ß§à§Ô§à §Ü§Ý§Ñ§ã§ã§Ñ §ã §á§Ñ§â§Ñ§Þ§Ö§ä§â§à§Þ §ä§Ú§á§Ñ T §Ü§à§ß§ã§ä§â§å§Ü§è§Ú§ñ §Ó§Ú§Õ§Ñ "friend class T;" §Ù§Ñ§á§â§Ö§ë§Ö§ß§Ñ (http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf). §¯§à §ñ §á§â§Ñ§Ô§Þ§Ñ§ä§Ú§ã§ä, §Ñ §ß§Ö §á§â§Ñ§Ó§à§Ó§Ö§Õ §ñ§Ù§í§Ü§Ñ. §´§à, §é§ä§à §ñ §ç§à§é§å §ã§Õ§Ö§Ý§Ñ§ä§î ¨C §Ó§á§à§Ý§ß§Ö §Ý§à§Ô§Ú§é§ß§à, §Ü§Ñ§Ü §Þ§Ú§ß§Ú§Þ§å§Þ §Ó §ä§Ö§ç §Þ§Ö§ã§ä§Ñ§ç §Ü§à§Õ§Ñ, §Ô§Õ§Ö §ï§ä§à §á§â§à§ã§ä§à §ß§Ö§à§Ò§ç§à§Õ§Ú§Þ§à, §á§à§ï§ä§à§Þ§å §ñ §Ù§Ñ§Ú§ß§ä§Ö§â§Ö§ã§à§Ó§Ñ§ß §Ó §ä§Ñ§Ü§à§Þ §â§Ö§ê§Ö§ß§Ú§Ú, §á§å§ã§ä§î §à§ß§à §Ú §ß§Ö§ã§ä§Ñ§ß§Õ§Ñ§â§ä§ß§à. §±§â§Ú§Þ§Ö§â #1, §á§â§Ú§Ó§Ö§Õ§Ö§ß§ß§í§Û §Ó§í§ê§Ö, §à§Ò§â§Ñ§Ò§Ñ§ä§í§Ó§Ñ§Ö§ä§ã§ñ §ä§Ñ§Ü§Ú§Þ§Ú §Ü§à§Þ§á§Ú§Ý§ñ§ä§à§â§Ñ§Þ§Ú §Ü§Ñ§Ü: Borland (5.51 and 5.6), Comeau (4.3.0.1), Digital Mars (GCC (2.95), Intel (6 and 7), Watcom (11 and 12), and Visual C++ (4.2 through 7.1). §°§Õ§ß§Ñ§Ü§à §à§ß §ß§Ö §â§Ñ§Ò§à§ä§Ñ§Ö§ä §ã CodeWarrior (7 and 8) §Ú§Ý§Ú GCC (3.2). §³ §Ü§à§Þ§á§Ú§Ý§ñ§ä§à§â§à§Þ Comeau §Ü§à§Õ §â§Ñ§Ò§à§ä§Ñ§Ö§ä §Ó §ã§ä§Ñ§ß§Õ§Ñ§â§ä§ß§à§Û §Ü§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§Ú, §Ö§ã§Ý§Ú §Ø§Ö §å§Ü§Ñ§Ù§Ñ§ä§î §æ§Ý§Ñ§Ô "¡ªstrict", §ä§à §Ü§à§Þ§á§Ú§Ý§ñ§ä§à§â §ß§Ñ§é§ß§Ö§ä "§â§å§Ô§Ñ§ä§î§ã§ñ", §é§ä§à §Ü§à§ß§ã§ä§â§å§Ü§è§Ú§ñ §Ú §Ó§ã§Ö §Ö§Ö §Ó§à§Ù§Þ§à§Ø§ß§í§Ö §æ§à§â§Þ§í §ß§Ö §ñ§Ó§Ý§ñ§ð§ä§ã§ñ §ã§ä§Ñ§ß§Õ§Ñ§â§ä§ß§í§Þ§Ú. §º§Ñ§Ò§Ý§à§ß§ß§í§Û §á§Ñ§â§Ñ§Þ§Ö§ä§â, §á§à §ã§å§ä§Ú, §Þ§à§Ø§Ö§ä §Ò§í§ä§î §á§â§à§ã§ä§í§Þ §ä§Ú§á§à§Þ (POD type), §Ñ §ß§Ö §Ü§Ý§Ñ§ã§ã§à§Þ, §ß§Ñ§á§â§Ú§Þ§Ö§â §ä§Ú§á§à§Þ "int". §¥§Ý§ñ §ß§Ö§Ü§à§ä§à§â§í§ç §Ü§à§Þ§á§Ú§Ý§ñ§ä§à§â§à§Ó - §ï§ä§à §á§â§à§Ò§Ý§Ö§Þ§Ñ. §´§Ñ§Ü§Ú§Ö §ä§Ú§á§í §ß§Ö §Þ§à§Ô§å§ä §Ò§í§ä§î §Õ§â§å§Ù§î§ñ§Þ§Ú, §á§à§ï§ä§à§Þ§å §ã§ä§à§Ú§ä §å§Ü§Ñ§Ù§Ñ§ä§î, §é§ä§à §ä§Ú§á, §á§Ö§â§Ö§Õ§Ñ§ß§ß§í§Û §Ó §Ü§Ñ§é§Ö§ã§ä§Ó§Ö §ê§Ñ§Ò§Ý§à§ß§ß§à§Ô§à §á§Ñ§â§Ñ§Þ§Ö§ä§â§Ñ ¨C §ï§ä§à §Ü§Ý§Ñ§ã§ã. §¯§Ñ§á§â§Ú§Þ§Ö§â: // §±§â§Ú§Þ§Ö§â #2 template class Thing { friend class T; // §²§Ñ§Ù§â§Ö§ê§Ñ§Ö§ä §Ü§Ý§Ñ§ã§ã§å T §Õ§à§ã§ä§å§á §Ü§à §Ó§ã§Ö§Þ §Õ§Ñ§ß§ß§í§Þ §Ú §Þ§Ö§ä§à§Õ§Ñ§Þ §Õ§Ñ§ß§ß§à§Ô§à §Ü§Ý§Ñ§ã§ã§Ñ. private: int value_; }; §¿§ä§à§ä §á§â§Ú§Þ§Ö§â §â§Ñ§Ò§à§ä§Ñ§Ö§ä §Ò§Ö§Ù §á§â§à§Ò§Ý§Ö§Þ §ã CodeWarrior, Digital Mars §Ú Watcom §Ü§à§Þ§á§Ú§Ý§ñ§ä§à§â§Ñ§Þ§Ú. §´§Ñ§Ü§Ú§Þ §à§Ò§â§Ñ§Ù§à§Þ §á§Ö§â§Ó§í§Û §Ý§Ú§Ò§à §Ó§ä§à§â§à§Û §á§â§Ú§Þ§Ö§â §ß§Ñ§Þ §á§à§Õ§ç§à§Õ§Ú§ä §Ó §ä§à§Þ §Ú§Ý§Ú §Ú§ß§à§Þ §ã§Ý§å§é§Ñ§Ö. §°§Õ§ß§Ñ§Ü§à §á§â§à§Ò§Ý§Ö§Þ§í §Õ§à §ã§Ú§ç §á§à§â §à§ã§ä§Ñ§ð§ä§ã§ñ §Õ§Ý§ñ §Ü§à§Þ§á§Ú§Ý§ñ§ä§à§â§Ñ GCC §Ó§Ö§â§ã§Ú§Ú 3.2. §¢§å§Õ§å§é§Ú §ä§Ö§Þ, §Ü§ä§à §ã§ä§à§â§à§ß§Ú§ä§ã§ñ §Ú§ã§á§à§Ý§î§Ù§à§Ó§Ñ§ß§Ú§ñ "§Õ§â§å§Ù§Ö§Û", §ñ §ß§Ö §ã§Þ§à§Ô §á§â§Ú§Õ§å§Þ§Ñ§ä§î §â§Ö§ê§Ö§ß§Ú§Ö §ï§ä§à§Û §á§â§à§Ò§Ý§Ö§Þ§í §Ú §á§â§à§Ü§à§ß§ã§å§Ý§î§ä§Ú§â§à§Ó§Ñ§Ý§ã§ñ §ã §â§Ö§Ò§ñ§ä§Ñ§Þ§Ú §Ú§Ù §Ô§â§å§á§á§í comp.lang.c++.moderated (http://www.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&newwindow=1&threadm=5d33192c.0310010048.44c06c13@posting.google.com&rnum=1&prev=), §Ü§à§ä§à§â§í§Ö §á§à§ã§à§Ó§Ö§ä§à§Ó§Ñ§Ý§Ú §Õ§Ó§Ñ §ã§Ý§Ö§Õ§å§ð§ë§Ú§ç §á§â§Ú§Þ§Ö§â§Ñ: // §±§â§Ú§Þ§Ö§â #3 template class Thing { struct friend_maker { typedef T T2; }; typedef typename friend_maker::T2 friend_type; friend class friend_type; private: int value_; }; // §±§â§Ú§Þ§Ö§â #4 template class Thing { template struct friend_maker { typedef T2 T3; }; typedef typename friend_maker::T3 friend_type; friend class friend_type; private: int value_; }; §´§Ñ§Ü§Ú§Þ §à§Ò§â§Ñ§Ù§à§Þ, §Þ§í §ß§Ñ§ê§Ý§Ú §â§Ö§ê§Ö§ß§Ú§ñ, §ã §á§à§Þ§à§ë§î§ð §Ü§à§ä§à§â§í§ç §Þ§à§Ø§ß§à §Ú§ã§á§à§Ý§î§Ù§à§Ó§Ñ§ä§î §ê§Ñ§Ò§Ý§à§ß§ß§í§Ö §á§Ñ§â§Ñ§Þ§Ö§ä§â§í §Ó §Ü§Ñ§é§Ö§ã§ä§Ó§Ö §Õ§â§å§Ù§Ö§Û §Ü§Ý§Ñ§ã§ã§Ñ §Õ§Ý§ñ §Ó§ã§Ö§ç §ã§à§Ó§â§Ö§Þ§Ö§ß§ß§í§ç §Ü§à§Þ§á§Ú§Ý§ñ§ä§à§â§à§Ó. §°§ã§ä§Ñ§Ý§à§ã§î §ä§à§Ý§î§Ü§à §á§â§Ú§Ó§Ö§ã§ä§Ú §ï§ä§à §Ü §Ò§à§Ý§Ö§Ö-§Þ§Ö§ß§Ö§Ö §å§Õ§à§Ò§ß§à§Þ§å §Ó§Ú§Õ§å. §¯§Ú§Ø§Ö §á§â§Ú§Ó§Ö§Õ§Ö§ß §Ü§à§Õ §ã §Ú§ã§á§à§Ý§î§Ù§à§Ó§Ñ§ß§Ú§Ö§Þ §á§â§Ö§á§â§à§è§Ö§ã§ã§à§â§Ñ §Õ§Ý§ñ §Ü§à§â§â§Ö§Ü§ä§ß§à§Ô§à §à§Ò§ì§ñ§Ó§Ý§Ö§ß§Ú§ñ §Ü§à§ß§ã§ä§â§å§Ü§è§Ú§Ú §Ó §Ù§Ñ§Ó§Ú§ã§Ú§Þ§à§ã§ä§Ú §à§ä §Ü§à§Þ§á§Ú§Ý§ñ§ä§à§â§Ñ. // §±§â§Ú§Þ§Ö§â #5 #if defined(__BORLANDC__) || \ defined(__COMO__) || \ defined(__DMC__) || \ ( defined(__GNUC__) && \ __GNUC__ < 3) || \ defined(__INTEL_COMPILER) || \ defined(__WATCOMC__) || \ defined(_MSC_VER) # define DECLARE_TEMPLATE_PARAM_AS_FRIEND(T) friend T #elif defined(__MWERKS__) # define DECLARE_TEMPLATE_PARAM_AS_FRIEND(T) friend class T #elif defined(__GNUC__) && \ __GNUC__ >= 3 # define DECLARE_TEMPLATE_PARAM_AS_FRIEND(T) \ struct friend_maker \ { \ typedef T T2; \ }; \ typedef typename friend_maker::T2 friend_type; \ friend friend_type #else // §®§í §ß§Ö §Ù§ß§Ñ§Ö§Þ, §Ü§Ñ§Ü§à§Û §Ü§à§Þ§á§Ú§Ý§ñ§ä§à§â §Ú§ã§á§à§Ý§î§Ù§å§Ö§ä§ã§ñ, // §Ó§à§Ù§Þ§à§Ø§ß§à §ã§Ý§Ö§Õ§å§Ö§ä §ã§Ô§Ö§ß§Ö§â§Ú§â§à§Ó§Ñ§ä§î §à§ê§Ú§Ò§Ü§å, §à§Õ§ß§Ñ§Ü§à §Ò§å§Õ§Ö§Þ §ß§Ñ§Õ§Ö§ñ§ä§î§ã§ñ, // §é§ä§à §à§ß §á§à§Õ§Õ§Ö§â§Ø§Ú§Ó§Ñ§Ö§ä §ä§Ñ§Ü§å§ð §Ü§à§ß§ã§ä§â§å§Ü§è§Ú§ð: # define DECLARE_TEMPLATE_PARAM_AS_FRIEND(T) friend T #endif §´§Ö§á§Ö§â§î §Þ§í §à§é§Ö§ß§î §á§â§à§ã§ä§à §Þ§à§Ø§Ö§Þ §Ú§ã§á§à§Ý§î§Ù§à§Ó§Ñ§ä§î §ä§Ñ§Ü§à§Û §Ü§à§Õ: // §±§â§Ú§Þ§Ö§â #6 template class Thing { DECLARE_TEMPLATE_PARAM_AS_FRIEND(T); private: int value_; }; §³§á§Ú§ã§à§Ü §Ü§à§Þ§á§Ú§Ý§ñ§ä§à§â§à§Ó §Ú §Õ§Ñ§ß§ß§í§Ö §à §ä§à§Þ, §Ü§Ñ§Ü§å§ð §æ§à§â§Þ§å §ê§Ñ§Ò§Ý§à§ß§ß§í§ç §Õ§â§å§Ù§Ö§Û §à§ß§Ú §á§à§Õ§Õ§Ö§â§Ø§Ú§Ó§Ñ§ð§ä §Þ§à§Ø§ß§à §á§à§ã§Þ§à§ä§â§Ö§ä§î §Ó §à§â§Ú§Ô§Ú§ß§Ñ§Ý§î§ß§à§Û §ã§ä§Ñ§ä§î§Ö. §®§à§Ú §Ú§ã§á§â§Ñ§Ó§Ý§Ö§ß§Ú§ñ §Ú §Õ§à§á§à§Ý§ß§Ö§ß§Ú§ñ §¹§ä§à §á§â§à§Ú§Ù§à§Û§Õ§Ö§ä, §Ö§ã§Ý§Ú §ß§Ñ§Þ §Ò§å§Õ§Ö§ä §ß§Ö§à§Ò§ç§à§Õ§Ú§Þ§à §à§Ò§ì§ñ§Ó§Ú§ä§î §Ò§à§Ý§î§ê§Ö §à§Õ§ß§à§Ô§à "§Õ§â§å§Ô§Ñ"? §¯§Ñ§á§â§Ú§Þ§Ö§â §Ó§à§ä §ä§Ñ§Ü: // §±§â§Ú§Þ§Ö§â #7 template class Thing { DECLARE_TEMPLATE_PARAM_AS_FRIEND(T1); DECLARE_TEMPLATE_PARAM_AS_FRIEND(T2); private: int value_; }; §®§Ñ§Ü§â§à§ã "DECLARE_TEMPLATE_PARAM_AS_FRIEND" §Ý§à§Ü§Ñ§Ý§î§ß§à §à§Ò§ì§ñ§Ó§Ý§ñ§Ö§ä §ã§ä§â§å§Ü§ä§å§â§å "friend_maker". §£ §Õ§Ñ§ß§ß§à§Þ §ã§Ý§å§é§Ñ§Ö §à§ß§Ñ §Ò§å§Õ§Ö§ä §ã§Ô§Ö§ß§Ö§â§Ú§â§à§Ó§Ñ§ß§Ñ §Õ§Ó§Ñ §â§Ñ§Ù§Ñ, §ß§à §Ú§Þ§Ö§ß§Ñ §à§ä§Ý§Ú§é§Ñ§ä§î§ã§ñ §ß§Ö §Ò§å§Õ§å§ä, §é§ä§à §á§â§Ú§Ó§Ö§Õ§Ö§ä §Ü §à§ê§Ú§Ò§Ü§Ö. §¹§ä§à§Ò§í §Ú§Ù§Ò§Ö§Ø§Ñ§ä§î §ä§Ñ§Ü§à§Ô§à §Ü§à§ß§æ§å§Ù§Ñ §ñ §ß§Ö§Þ§ß§à§Ô§à §á§Ö§â§Ö§Õ§Ö§Ý§Ñ§Ý §Þ§Ñ§Ü§â§à§ã §Õ§Ý§ñ §ä§à§Ô§à, §é§ä§à§Ò§í §Ú§Þ§Ö§ß§Ñ §ã§ä§â§å§Ü§ä§å§â§í §Ò§í§Ý§Ú §å§ß§Ú§Ü§Ñ§Ý§î§ß§í§Þ§Ú §Ó §Ù§Ñ§Ó§Ú§ã§Ú§Þ§à§ã§ä§Ú §à§ä §Ú§Þ§Ö§ß§Ú §ä§Ú§á§Ñ "§Õ§â§å§Ô§Ñ". // §±§â§Ú§Þ§Ö§â #8 # define DECLARE_TEMPLATE_PARAM_AS_FRIEND(T) \ struct make_friend_##T \ { \ typedef T T2; \ }; \ typedef typename make_friend_##T::T2 friend_type_##T; \ friend friend_type_##T §£§à§ä §Ú §Ó§ã§Ö, §ä§Ö§á§Ö§â§î §Þ§à§Ø§ß§à §Ú§ã§á§à§Ý§î§Ù§à§Ó§Ñ§ä§î §ï§ä§à §â§Ö§ê§Ö§ß§Ú§Ö §Ó §ã§Ó§à§Ú§ç §á§â§à§Ö§Ü§ä§Ñ§ç. §¯§Ñ§á§â§Ú§Þ§Ö§â, §ñ §ã§Õ§Ö§Ý§Ñ§Ý §Ó§Ö§â§ã§Ú§ð §Þ§Ñ§Ü§â§à§ã§Ñ §Õ§Ý§ñ §á§â§à§Ö§Ü§ä§Ñ Boost. #ifndef BOOST_TEMPLATE_FRIEND_HPP #define BOOST_TEMPLATE_FRIEND_HPP #include #include #if defined(BOOST_MSVC) && BOOST_WORKAROUND(BOOST_MSVC, >= 1020) # pragma once #endif #if (defined(__GNUC__) && BOOST_WORKAROUND(__GNUC__, < 3)) || \ defined(__BORLANDC__) || \ defined(__COMO__) || \ defined(__DMC__) || \ defined(__WATCOMC__) || \ defined(BOOST_MSVC) || \ defined(BOOST_INTEL) # define BOOST_DECLARE_TEMPLATE_FRIEND(T) friend T #elif defined(__MWERKS__) # define BOOST_DECLARE_TEMPLATE_FRIEND(T) friend class T #elif defined(__GNUC__) && BOOST_WORKAROUND(__GNUC__, >= 3) # define BOOST_DECLARE_TEMPLATE_FRIEND(T) \ struct make_friend_##T \ { \ typedef T T2; \ }; \ typedef typename make_friend_##T::T2 friend_type_##T; \ friend friend_type_##T #else # define BOOST_DECLARE_TEMPLATE_FRIEND(T) friend T #endif #endif // BOOST_TEMPLATE_FRIEND_HPP