§¬§Ñ§Ü §á§à§Õ§â§å§Ø§Ú§ä§î§ã§ñ §ã §ê§Ñ§Ò§Ý§à§ß§ß§í§Þ§Ú §á§Ñ§â§Ñ§Þ§Ö§ä§â§Ñ§Þ§Ú
§®§ï§ä§î§ð §µ§Ú§Ý§ã§à§ß (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