__STL_NULL_TMPL_ARGS是定义在 <stl_config.h>,定义如下:
# ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
# define __STL_NULL_TMPL_ARGS <>
# else
# define __STL_NULL_TMPL_ARGS
# endif
在STL中的<stl_stack.h>中有出现
template <class T, class Sequence = deque<T> >
class stack {
friend bool operator== __STL_NULL_TMPL_ARGS (const stack&, const stack&);
friend bool operator< __STL_NULL_TMPL_ARGS (const stack&, const stack&);
//......
};
//也就是:
template <class T, class Sequence = deque<T> >
class stack {
friend bool operator== <> (const stack&, const stack&);
friend bool operator< <> (const stack&, const stack&);
//...
};
//实现:
template <class T, class Sequence>
bool operator==(const stack<T, Sequence>& x, const stack<T, Sequence>& y) {
return x.c == y.c;
}
template <class T, class Sequence>
bool operator<(const stack<T, Sequence>& x, const stack<T, Sequence>& y) {
return x.c < y.c;
}
下面这四种写法都是可以的:
//第一种写法:
friend bool operator== __STL_NULL_TMPL_ARGS (const stack&, const stack&);
friend bool operator< __STL_NULL_TMPL_ARGS (const stack&, const stack&);
//第二种写法:
friend bool operator== <T> (const stack<T>&, const stack<T>&);
friend bool operator< <T> (const stack<T>&, const stack<T>&);
//第三种写法:
friend bool operator== <T> (const stack&, const stack&);
friend bool operator< <T> (const stack&, const stack&);
//第四种写法:
friend bool operator== <> (const stack&, const stack&);
friend bool operator< <> (const stack&, const stack&);
但是不能写成这样:
//不可以
// friend bool operator== (const stack&, const stack&);
// friend bool operator< (const stack&, const stack&);