写在前面 学习黑马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
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
friend void printPerson2<>(Person<T1, T2> &p);
private:
T1 m_name;
T2 m_age;
};
在这里printPerson2就是类模板全局函数类外实现的使用: 首先在类模板中声明的时候需要在函数名称后面加一个空模板<>; 其次我在类外实现需要让编译器提前知道此函数模板是存在的,即将全局函数的实现写在类模板前面; 最后因为函数模板中使用到了Person这个类模板,所以前面还需要声明这个Person类模板。
|