gpt4 book ai didi

c++ - 从 .h 和 .cpp 文件定义纯虚函数会产生链接器错误?

转载 作者:太空狗 更新时间:2023-10-29 20:44:15 27 4
gpt4 key购买 nike

我试图为我所有的实验室工作建立一个“框架”,但后来我遇到了一个令人沮丧的链接器错误,处理纯虚函数的实现。

当我从 .cpp 文件(如 returntype classname::function() {.....} )定义纯虚函数时,出现链接器错误,告诉我纯虚函数的定义不是提供...

然而,当我简单地将定义放入头文件时,它运行良好。我知道我听起来很困惑......但下面的代码肯定会帮助您了解正在发生的事情。

谁能帮我理解为什么会这样?

该项目包含 4 个文件,(2 个头文件和 2 个 cpp 文件)

1> 框架.h :

 #ifndef _FRAMEWORK
#define _FRAMEWORK

#include<iostream>

class labTest

{
public :
virtual void execute() = 0;
};
#endif

======================================

2 >堆栈数组.h :

#include "FrameWork.h"
#include<iostream>
using namespace std;

template <class T>
class Stack_Array : public labTest
{

public:
virtual void execute();
};

======================================

3> Stack_Array.cpp :

#include "Stack_Array.h"
template<class T>

virtual void Stack_Array<T>::execute(void) // I beleive i am defining the pure virtual function here, but my compiler ll not agree.
{
std::cout << "Test";
}

======================================

4> 主程序.cpp :

#include<istream>
#include"FrameWork.h"
#include"Stack_Array.h"
#include<vector>
using namespace std;

void main()
{
vector<labTest*> list(5);
vector<labTest*>::iterator it;
it = list.begin();
Stack_Array<int>* sa = new Stack_Array<int>();

list.insert(it,sa);
list[0]->execute();
getchar();

}

=========================================

构建输出:

1>------ Rebuild All started: Project: Lab FrameWork, Configuration: Debug Win32 ------
1>Build started 11/20/2012 6:16:48 PM.
1>InitializeBuildStatus:
1> Touching "Debug\Lab FrameWork.unsuccessfulbuild".
1>ClCompile:
1> Stack_Array.cpp
1> Main_Run.cpp
1> Generating Code...
1>Main_Run.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Stack_Array<int>::execute(void)" (?execute@?$Stack_Array@H@@UAEXXZ)
1>C:\Users\BSP-4\Documents\Visual Studio 2010\Projects\SFML\Lab FrameWork\Debug\Lab FrameWork.exe : fatal error LNK1120: 1 unresolved externals
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:01.64

========== Rebuild All: 0 succeeded, 1 failed, 0 skipped =======================

如果我制作我的 Stack_Array.h 就可以了:

#include "FrameWork.h"
#include<iostream>
using namespace std;

template <class T>
class Stack_Array : public labTest
{

public:
void execute() // give the definition here instead of Stack_Array.cpp and it will work !
{
cout << "Test Success !!";
}
};

我确定这是一些愚蠢的事情..我是否忽略了什么?..但我仍然需要帮助......

提前致谢...

最佳答案

模板的定义必须在所有使用它的翻译单元中可用(除非涉及明确的专门化/实例化,这里不是这种情况)。也就是说,类模板的成员函数必须在头文件中定义。

关于c++ - 从 .h 和 .cpp 文件定义纯虚函数会产生链接器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13474367/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com