类模版可以有友元函数。
友元函数可以是普通函数。
template <typename T> class Stack { private: T items[10]; int top; public: Stack(); void setTop(int top); bool isEmpty(); friend int size2(Stack<T> & stack); };
size2()
并不是函数模版,但它的参数是类模版。定义size2()
,其类模版参数必须指定类型。
int size2(Stack<int> & stack) { return stack.top; }
size2()
只能接受Stack<int>
。如果使用Stack<double>
,则程序编译失败:Undefined symbol: size2(Stack<double>&)
。
void test9() { Stack<int> a; a.setTop(2); int length2 = size2(a); std::cout << "Stack<int> a length2: " << length2 << std::endl; Stack<double> b; // size2(b); // Undefined symbol: size2(Stack<double>&) }
友元函数可以是函数模版。
template <typename T> class Stack { private: T items[10]; int top; public: Stack(); void setTop(int top); bool isEmpty(); template <typename T4> friend int size4(T4 & stack); };
size4()
是函数模版,其定义如下。
template <typename T4> int size4(T4 & stack) { return stack.top; }
size4()
只能接受这样的类型:包含成员变量top
。Stack
是符合的。
void test10() { Stack<int> a; a.setTop(4); int length4 = size4(a); std::cout << "Stack<int> a length4: " << length4 << std::endl; }
阅读原文,关注公众号[空与一]