我有一个类似{/ p>的课程graph.h
#include <fstream>
using namespace std;
template <typename T>
class Graph
{
private:
T ** graphData;
public:
Graph(ifstream & inputFile);
~Graph(){};
friend ofstream & operator<<(ostream&, const Graph &);
};
Graph(ifstream & inputFile);
中定义了构造函数graph.cpp
:
#include "graph.h"
template <typename T>
Graph<T>::Graph(ifstream & inputFile){}
我试图在main.cpp中创建这个类的实例:
#include <fstream>
#include "graph.h"
using namespace std;
int main()
{
ifstream myFile ("example.txt");
Graph<int> * IntGraph = new Graph<int>(myFile);
return 0;
}
但我一直收到这些错误
Error 1 error LNK2019: unresolved external symbol "public: __thiscall Graph<int>::Graph<int>(class std::basic_ifstream<char,struct std::char_traits<char> > &)" (??0?$Graph@H@@QAE@AAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@@Z) referenced in function _main C:\Users\Vlada\Dropbox\FJFI\BP - Graph partitioning\BP-program\BP-program\main.obj BP-program
Error 2 error LNK1120: 1 unresolved externals C:\Users\Vlada\Dropbox\FJFI\BP - Graph partitioning\BP-program\Debug\BP-program.exe BP-program
我试图搜索,但我发现的结果都不像我这样。
答案 0 :(得分:2)
每个引用模板类成员函数的编译单元都需要查看函数定义。
因此将构造函数定义从cpp模块移动到标题。
答案 1 :(得分:-1)
在声明graph.h之后使用以下include语句。这样,实现仍然与定义分离,编译器可以访问它。
#include "graph.cpp"
模板不是类或函数。模板基本上是通用模式,它可以帮助编译器生成特定类型的请求类或函数。
为了让编译器生成代码,它必须同时看到模板定义(不仅仅是声明)和特定类型/用于“填充”模板的任何内容。例如,如果您尝试使用图表,则编译器必须同时看到图表模板以及您尝试制作特定的事实图强>
您的编译器在编译另一个.cpp文件时可能不记得一个.cpp文件的详细信息。这称为“单独的编译模型。”
参考文献: