Определение чисто виртуальных функций из файлов .h и .cpp приводит к ошибке компоновщика?

Я пытался собрать «каркас» для всех моих лабораторных работ, но затем я столкнулся с ошибкой компоновщика, связанной с реализацией чисто виртуальной функции.

Когда я определяю чисто виртуальную функцию из файла .cpp (например, returntype classname :: function () {…..}), я получаю ошибку компоновщика, говорящую, что определение чисто виртуальной функции не предоставлено .. ,

Однако, когда я просто помещаю определение в заголовочный файл, оно работает хорошо … Я знаю, что это звучит странно … но приведенный ниже код наверняка поможет вам увидеть, что происходит ..

Может кто-нибудь помочь мне понять, почему это происходит?

Проект содержит 4 файла (2 заголовка и 2 файла cpp)

1> FrameWork.h:

 #ifndef _FRAMEWORK
#define _FRAMEWORK

#include<iostream>

class labTest

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

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

2> Stack_Array.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> Main_Run.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 !!";
}
};

Я уверен, что это какая-то глупость … Я что-то упустил из виду? .. но мне все еще нужна помощь ….

Заранее спасибо…

3

Решение

Определение шаблона должно быть доступно во всех единицах перевода, в которых он используется (если не задействована явная специализация / конкретизация, что здесь не так). Другими словами, функции-члены шаблонов классов должны быть определены в заголовочных файлах.

3

Другие решения

void Stack_Array<T>::execute(void) определяется только в модуле компиляции, где он определен. За пределами Stack_Array.cpp ваш компилятор не знает, как реализовать execute на Stack_Array<T>, Как правило, запросы на создание экземпляра шаблона не передаются от одного исполнительного устройства другому. Теперь вы можете исправить это, поместив реализацию Stack_Array<T> в заголовочные файлы или путем явного создания <T> что вы хотите экспортировать в Stack_Array.cpp,

C ++ попытался добавить поддержку экспорта модулей кросс-компиляции и запроса на создание экземпляров шаблона, но это сложно.

Самое простое решение — переместить вашу реализацию в заголовочный файл и убедиться, что методы встроены (или в тело класса).

2

По вопросам рекламы [email protected]