Форум программистов, компьютерный форум CyberForum.ru

Ошибка LNK2019 при сборке проекта. - C++

Восстановить пароль Регистрация
 
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
18.11.2011, 13:02     Ошибка LNK2019 при сборке проекта. #1
В проект включена статическая библиотека, методами классов которой нужно воспользоваться.
Итак:
Заголовочный файл проекта (headers\TuringTranslator.h):
C++
1
2
3
...
#include "headers\DSAA.h"
...
, где DSAA.h является заголовочным файлом для необходимой статической библиотеки.
Код проекта (TuringTranslator.cpp):
C++
1
2
3
4
5
...
#include "headers\TuringTranslator.h"
...
_DSAA DoublyLinkedList<char> tape;
...
Выдается ошибка :
C++
1
Error   1   error LNK2019: unresolved external symbol "public: __thiscall dsaa::DoublyLinkedList<char>::DoublyLinkedList<char>(void)" (??0?$DoublyLinkedList@D@dsaa@@QAE@XZ) referenced in function "int __cdecl initialization(char const *)" (?initialization@@YAHPBD@Z)
Можно подумать, что не описана реализация конструктора класса DoublyLinkedList, смотрим библиотеку:
Заголовочный файл библиотеки (headers\DSAA.h)
C++
1
2
3
4
5
6
7
8
9
10
11
12
...
#define _DSAA_BEGIN     namespace dsaa {
#define _DSAA_END               }
#define _DSAA   ::dsaa::
 
_DSAA_BEGIN
    template <typename dataType> class DoublyLinkedList {
    public:
        DoublyLinkedList();
    };
_DSAA_END
...
И конечно не забываем про код библиотеки (DSAA.cpp)
C++
1
2
3
4
5
6
7
#include "headers\DSAA.h"
 
template <typename dataType> _DSAA DoublyLinkedList<dataType>::DoublyLinkedList()
{
    
}
...
Реализация конструктора присутствует, что и приводит в тупик.
Но при этом, если библиотеку делать приложением (соответственно добавив main и создав там экземпляр класса), то оно работает корректно само по себе.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
722 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
18.11.2011, 13:04     Ошибка LNK2019 при сборке проекта. #2
http://msdn.microsoft.com/ru-ru/library/799kze2z.aspx
Bers
Заблокирован
18.11.2011, 13:11     Ошибка LNK2019 при сборке проекта. #3
У вас в DSAA.h прототип, а в DSAA.cpp - реализация.

В отличие от обычных классов так делать с шаблонами нельзя.

Если вы сделаете вот так, то скорее всего скомпилируется и будит работать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//headers\DSAA.h
//никакого файла cpp для данного хэдэра не нужно
 
#define _DSAA_BEGIN             namespace dsaa {
#define _DSAA_END                               }
#define _DSAA   ::dsaa::
 
_DSAA_BEGIN
        template <typename dataType> class DoublyLinkedList {
        public:
                DoublyLinkedList()  {/*здесь тело*/}
               
        };
_DSAA_END
...
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
18.11.2011, 22:04  [ТС]     Ошибка LNK2019 при сборке проекта. #4
Цитата Сообщение от Bers Посмотреть сообщение
У вас в DSAA.h прототип, а в DSAA.cpp - реализация.

В отличие от обычных классов так делать с шаблонами нельзя.
Хм, прискорбно это слышать, так как я привел всего лишь крохотный отрывок из класса. На самом деле класс имеет сложную иерархическую структуру, реализацию которой выводить в заголовочный файл довольно таки накладно и на мой взгляд не эстетично.
Для тех, кто столкнулся с подобной проблемой, я поделюсь своими исследованиями данного вопроса:
На stackoverflow было задано множество подобных вопросов. Ответ, на один из них полностью раскрывает проблему и приводит различные варианты решения, прочитать которые можно здесь. Также автор ссылается на тему, которая наиболее полно раскрывает причину и решения данной проблемы. Тему можно найти здесь.
Спасибо за ответ.
Yandex
Объявления
18.11.2011, 22:04     Ошибка LNK2019 при сборке проекта.
Ответ Создать тему
Опции темы

Текущее время: 14:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru