未解析的外部符号 - 构造函数

时间:2016-03-02 19:24:08

标签: c++ compiler-errors

我有一个类似{/ 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

我试图搜索,但我发现的结果都不像我这样。

2 个答案:

答案 0 :(得分:2)

每个引用模板类成员函数的编译单元都需要查看函数定义。

因此将构造函数定义从cpp模块移动到标题。

答案 1 :(得分:-1)

在声明graph.h之后使用以下include语句。这样,实现仍然与定义分离,编译器可以访问它。

#include "graph.cpp"

模板不是函数。模板基本上是通用模式,它可以帮助编译器生成特定类型的请求类或函数。

为了让编译器生成代码,它必须同时看到模板定义(不仅仅是声明)和特定类型/用于“填充”模板的任何内容。例如,如果您尝试使用图表,则编译器必须同时看到图表模板以及您尝试制作特定的事实图

您的编译器在编译另一个.cpp文件时可能不记得一个.cpp文件的详细信息。这称为“单独的编译模型。”

  

参考文献:

     
      
  1. https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl
  2.   
  3. Why can templates only be implemented in the header file?
  4.