|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Visual C++ проблемма с линкером |
|
C/C++ - Visual C++ проблемма с линкером
|
Старожил Сообщения: 222 |
Профиль | Отправить PM | Цитировать Писал программу, вроде бы все правильно, а вылетают такие ошибки:
error LNK2019: unresolved external symbol "public: __thiscall vector<int>::~vector<int>(void)" (??1?$vector@H@@QAE@XZ) referenced in function _main Lr9_10.obj Lr9_10 error LNK2019: unresolved external symbol "public: void __thiscall vector<int>::push_back(int)" (?push_back@?$vector@H@@QAEXH@Z) referenced in function _main Lr9_10.obj Lr9_10 error LNK2019: unresolved external symbol "public: __thiscall vector<int>::vector<int>(void)" (??0?$vector@H@@QAE@XZ) referenced in function _main Lr9_10.obj Lr9_10 Среда Visual Studio 2008 Вот код программы: //main.cpp #include "stdafx.h" #include "vector.h" int main() { vector<int>().push_back(1); return 0; } //vector.h #pragma once template <typename Type> class vector { private: int size; Type* array; static int instanceCounter; void newInstance(); public: vector(); vector(int size); vector(int size, Type value); vector(int size, const Type* pointer); vector(const vector& instance); int length(); void push_back(Type value); void destroyInstance(); static int getInstanceCounter(); vector operator +=(vector instance); vector operator +=(Type instance); vector operator =(vector instance); bool operator ==(vector instance); bool operator !=(vector instance); Type operator [](int iterator); ~vector(); }; template <typename Type> int vector<Type>::instanceCounter=0; //vector.cpp #include "stdafx.h" #include "vector.h" template <typename Type> vector<Type>::vector() { this.size=0; this.array=new Type[size]; newInstance(); } template <typename Type> vector<Type>::vector(int size) { this.size=size; this.array=new Type[size]; newInstance(); } template <typename Type> vector<Type>::vector(int size, Type value) { this.size=size; this.array=new Type[size]; for(int i=0; i<size; i++) array[i]=value; newInstance(); } template <typename Type> vector<Type>::vector(int size, const Type* pointer) { this.size=size; this.array=new Type[size]; for(int i=0; i<size; i++) array[i]=pointer[i]; newInstance(); } template <typename Type> vector<Type>::vector(const vector& instance) { this.size=instance.size; this.array=new Type[size]; for(int i=0; i<size; i++) this.array[i]=instance.array[i]; newInstance(); } template <typename Type> int vector<Type>::length() { return this.size; } template <typename Type> void vector<Type>::push_back(Type value) { this.size++; Type* temp=array; array=new Type[this.size]; for(int i=0; i<size-1; i++) array[i]=temp[i]; array[size-1]=value; } template <typename Type> void vector<Type>::destroyInstance() { if(instanceCounter>0) instanceCounter--; delete[] array; } template <typename Type> void vector<Type>::newInstance() { instanceCounter++; } template <typename Type> static int vector<Type>::getInstanceCounter() { return instanceCounter; } template <typename Type> vector<Type> vector<Type>::operator +=(vector instance) { Type* temp=this.array; array=new Type[this.size+instance.size]; for(int i=0; i<this.size+instance.size; i++) if(i<this.size) array[i]=temp[i]; else array[i]=instance.array[i-instance.size+1]; this.size+=instance.size; } template <typename Type> vector<Type> vector<Type>::operator +=(Type instance) { Type* temp=this.array; array=new Type[this.size++]; for(int i=0; i<this.size-1; i++) array[i]=temp[i]; array[size-1]=instance; } template <typename Type> vector<Type> vector<Type>::operator =(vector instance) { } template <typename Type> bool vector<Type>::operator ==(vector instance) { } template <typename Type> bool vector<Type>::operator !=(vector instance) { } template <typename Type> Type vector<Type>::operator [](int iterator) { iterator<size ? return this.array[iterator] : return NULL; } template <typename Type> vector<Type>::~vector() { destroyInstance(); } |
|
------- Отправлено: 02:57, 24-05-2011 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Цитата DaRiYs:
Цитата DaRiYs:
Обычно такое бывает, когда функция была объявлена, но не определена. Также такая ошибка часто происходит с шаблонами, у которых тело функции расположено в cpp файле (который через include не подключается). Скорее всего здесь причина в неправильном подключении стандартных библиотек |
||
------- Отправлено: 07:26, 24-05-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 222
|
Профиль | Отправить PM | Цитировать Цитата El Scorpio:
Цитата El Scorpio:
|
||
------- Отправлено: 11:49, 24-05-2011 | #3 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Цитата DaRiYs:
Проблема шаблонов в том, что их машинный код создаётся под каждый экземпляр подставленного типа данных и только в момент использования. Если разместить исходный код шаблонной функции (метода шаблона класса) в cpp модуля, то этот код в другие модули подключён не будет. Соответственно конкретные реализации указанных функций и методов не скомпилируются. Перенеси весь код класса vector<T> в vector.h |
|
------- Отправлено: 02:38, 25-05-2011 | #4 |
Старожил Сообщения: 222
|
Профиль | Отправить PM | Цитировать Цитата El Scorpio:
|
||
------- Отправлено: 13:29, 25-05-2011 | #5 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Повторяю ещё раз - компилируются только те функции, которые используются. А у шаблонов вообще каждая реализация под конкретный класс данных компилируется отдельно по мере использования.
Да, можно разместить код медотодов класса vector<T> в .cpp, а в .h-файле прописать команду на принудительную компиляцию класса vector<int>. Однако в этом случае будет создана только реализация этого класса под один единственный тип данных, а подстановка в шаблон других классов вызовет ту же самую ошибку. Так что существует только одно "правильное" размещение кода шаблонов - в тех файлах, которые "подключаются" к другим модулям. |
------- Отправлено: 01:22, 26-05-2011 | #6 |
Старожил Сообщения: 222
|
Профиль | Отправить PM | Цитировать Понял. Спасибо за помощь
|
------- Отправлено: 02:07, 26-05-2011 | #7 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Разное - Visual Basic 2010: Проблемма при создании табулированного браузера | Radeon06 | Программирование и базы данных | 0 | 09-05-2011 01:11 | |
Проблемма | Faustin | Хочу все знать | 11 | 12-04-2010 10:39 | |
Save Visual Studio 2005 - Open Visual Studio 2003 | XCodeR | Программирование и базы данных | 3 | 07-07-2008 22:47 | |
Проблемма с XP. | Mustchem | Microsoft Windows 2000/XP | 5 | 10-01-2006 20:25 | |
Visual Studio6.0 Visual FoxPro не могу найти меню Database | Serg170580 | Программирование и базы данных | 1 | 07-04-2003 23:17 |
|