类模板分文件编写:
类模板成员函数 分文件编写 产生的问题以及解决方式是什么呢?
问题描述
类模板中**成员函数**创建时机是在**调用**阶段,导致分文件编写时**链接**不到
解决方案:
1、直接包含.cpp源文件:
person.h中的代码:
#pragma once
#include <iostream>
using namespace std;template<class T1, class T2>
class Person {
public:Person(T1 name, T2 age);void showPerson();
public:T1 m_Name;T2 m_Age;
};
person.cpp中的主要代码:
//构造函数 类外实现
template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age) {this->m_Name = name;this->m_Age = age;
}//成员函数 类外实现
template<class T1, class T2>
void Person<T1, T2>::showPerson() {cout << "Name: " << this->m_Name << " Age:" << this->m_Age << endl;
}
main.cpp中的代码:
#include <iostream>
#include "person.hpp"
#include <windows.h>//用于函数SetConsoleOutputCP(65001);更改cmd编码为utf8
using namespace std;void test01(){Person<string, int> p("tom", 20);p.showPerson();
}int main(){SetConsoleOutputCP(65001);test01();system("pause");return 0;
}
因为成员函数的编译是在调用
阶段,如果成员函数在.h
中实现,这个实现并没有编译,所以会出现报错。那么,成员函数得单独在一个cpp文件中实现,这样比较麻烦。因此推荐第二种写法:
2、将声明和实现写到同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制 (推荐这种方式):
person.hpp中代码:
#pragma once //防止头文件重复包含
#include <iostream>
using namespace std;
#include <string>template<class T1, class T2>
class Person {
public:Person(T1 name, T2 age);void showPerson();
public:T1 m_Name;T2 m_Age;
};//构造函数 类外实现
template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age) {this->m_Name = name;this->m_Age = age;
}//成员函数 类外实现
template<class T1, class T2>
void Person<T1, T2>::showPerson() {cout << "姓名: " << this->m_Name << " 年龄:" << this->m_Age << endl;
}
类模板分文件编写.cpp中代码:
#include<iostream>
using namespace std;//#include "person.h"
#include "person.cpp" //解决方式1,包含cpp源文件//解决方式2,将声明和实现写到一起,文件后缀名改为.hpp
#include "person.hpp"
void test01()
{Person<string, int> p("Tom", 10);p.showPerson();
}int main() {test01();system("pause");return 0;
}
总结:主流的解决方式是第二种,将类模板成员函数写到一起,并将后缀名改为.hpp
附:C++函数分文件编写(VScode2021配置教程)