包含.h文件时链接器错误,但包含相应的.cpp文件时消失

时间:2012-05-05 07:28:31

标签: c++ header linker

这很奇怪。当我包含一个.h文件(GeneralSearch.h)时,怎么可能出现错误,但是当我包含.cpp文件(GeneralSearch.cpp)时,一切似乎都工作得很好?

.h文件

#ifndef GENERALSEARCH_H_
#define GENERALSEARCH_H_

#include "Problem.h"
#include "Node.h"

template <class T>
class GeneralSearch
{
public:

    const Node* treeSearch(const Problem &problem) const;
    const Node* graphSearch(const Problem &problem, T &fringe = T()) const;

private:
    void expand(const Node &node, const Problem &problem, list<const Node*> &out) const;
};

#endif

.cpp文件

#include "GeneralSearch.h"
template <class T>
void GeneralSearch<T>::expand(const Node &node, const Problem &problem, list<const Node*> &out) const
{
...
}

template <typename T>
const Node* GeneralSearch<T>::treeSearch(const Problem &problem) const
{
...
}

template <typename T>
const Node* GeneralSearch<T>::graphSearch(const Problem &problem, T &fringe = T()) const
{
...
}

程序文件 - 工作

#include "GeneralSearch.cpp"
#include "DummyProblem.h"
#include "DepthFirstSearch.h"
#include <queue>

int main (int argc, char* argv[]){}

程序文件 - 不工作

#include "GeneralSearch.h"
#include "DummyProblem.h"
#include "DepthFirstSearch.h"
#include <queue>

int main (int argc, char* argv[]){}

1 个答案:

答案 0 :(得分:1)

链接器尝试在链接时查找未解析名称的定义。在第二种情况下,链接器无法找到类GeneralSearch的成员函数的定义,因此您会收到错误。