写在前面
学习黑马C++视频总结的知识点;
一. 类模板中全局函数类内实现
template <typename T1, typename T2>
class Person
{
public:
Person(T1 name, T2 age)
{
this->m_name = name;
this->m_age = age;
}
#if 0
//全局函数类内实现
friend void printPerson(Person<T1, T2> &p)
{
std::cout << "姓名:" << p.m_name << " " << "年龄:" << p.m_age << std::endl;
}
#endif
//全局函数类外实现(这是一个普通函数的声明)
//加一个空模板的函数模板
//如果全局函数是类外实现的话,需要让编译器提前知道函数模板的存在
//即将实现写在函数模板前面,并且声明Person类(Person为类模板)
friend void printPerson2<>(Person<T1, T2> &p);
private:
T1 m_name;
T2 m_age;
};
在这里printPerson就是一个类模板全局函数类内实现的使用,即:直接在类内将函数声明为有元即可;
但是还有另外一种情况:类模板全局函数在类外实现
template <typename T1,typename T2>
class Person;
//这是一个函数模板的类外实现
template <typename T1, typename T2>
void printPerson2(Person<T1, T2> &p)
{
std::cout << "姓名:" << p.m_name << " " << "年龄:" << p.m_age << std::endl;
}
template <typename T1, typename T2>
class Person
{
public:
Person(T1 name, T2 age)
{
this->m_name = name;
this->m_age = age;
}
#if 0
//全局函数类内实现
friend void printPerson(Person<T1, T2> &p)
{
std::cout << "姓名:" << p.m_name << " " << "年龄:" << p.m_age << std::endl;
}
#endif
//全局函数类外实现(这是一个普通函数的声明)
//加一个空模板的函数模板
//如果全局函数是类外实现的话,需要让编译器提前知道函数模板的存在
//即将实现写在函数模板前面,并且声明Person类(Person为类模板)
friend void printPerson2<>(Person<T1, T2> &p);
private:
T1 m_name;
T2 m_age;
};
在这里printPerson2就是类模板全局函数类外实现的使用:
首先在类模板中声明的时候需要在函数名称后面加一个空模板<>;
其次我在类外实现需要让编译器提前知道此函数模板是存在的,即将全局函数的实现写在类模板前面;
最后因为函数模板中使用到了Person这个类模板,所以前面还需要声明这个Person类模板。