Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для Lepeshkaa
0 / 0 / 0
Регистрация: 06.01.2017
Сообщений: 51

Ошибка при создании шаблонной очереди (LNK2019 ссылка на неразрешенный внешний символ)

06.02.2017, 18:11. Показов 1907. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет

Помогите найти ошибку при создании шаблонного класса. Искал синтаксис в интернете, всё нормально, ошибок быть не должно.

Вот собственно сама ошибка:
Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Programm::QueueDc<double>::QueueDc<doubl e>(int)" (??0?$QueueDc@N@Programm@@QAE@H@Z) в функции _main C:\Users\Елена\Documents\Visual Studio 2012\Projects\Queue\Исходный код.obj Queue

Код заголовочного файла:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma once
 
namespace Programm
{
    //На основе динамического массива
    template<class T> class QueueDc
    {
    private: 
        T* queue;
        int Max;
        int i,j;
    public:
        QueueDc(int);
 
        void Push(T);
        void Pop();
        bool Is_empty();
        bool Is_full();
 
        ~QueueDc();
    };
}

Код файла .cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "Queue.h"
#include <iostream>
 
namespace Programm
{
    template<class T> QueueDc<T>::QueueDc(int number)
    {
        Max = 100;
        i = 0;
        j = 0;
        if(number <= Max)
        {
            queue = new T[number];
            Max = number-1;
        }
        else std::cout<<"Переполнение стека!";
    }
 
    template<class T> void QueueDc<T>::Push(T a)
    {
        if(i <= Max)
        {
            queue[i] = a;
            i++;
        }
        else return;
    }
    template<class T> void QueueDc<T>::Pop()
    {
        if(j <= Max)
        {
            std::cout<<queue[j]<<std::endl;
            j++;
        }
        else return;
    }
    template<class T> bool QueueDc<T>::Is_full()
    {
        if(i <= Max) return false;
        else return true;
    }
    template<class T> bool QueueDc<T>::Is_empty()
    {
        if(j <= Max) return false;
        else return true;
    }
 
    template<class T> QueueDc<T>::~QueueDc()
    {
        delete [] queue;
    }
}
Код исходного файла .cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include "Queue.h"
 
using namespace std;
using namespace Programm;
 
int main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
 
    
 
    QueueDc<double> a(3);
 
    a.Push(1.1);
    a.Push(2.2);
    a.Push(3.33);
 
 
    _getch();
}
Добавлено через 1 минуту
Когда перенёс определение функций в сам заголовочный файл, то ошибок не было) Значит неправильно определяю в файле .cpp функции. В интернете смотрел, вроде всё правильно, вообщем я в недоумении)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.02.2017, 18:11
Ответы с готовыми решениями:

Ошибка при написании класса: error LNK2019: ссылка на неразрешенный внешний символ
Код: int _tmain(int argc, _TCHAR* argv) { Fraction x, x2, y, y2, fl, res, c; cout &lt;&lt; &quot;...&quot; &lt;&lt; endl; x.setFraction(); ...

Ошибка при работе со структурами: error LNK2019: ссылка на неразрешенный внешний символ _main
#include&lt;iostream&gt; using namespace std; struct baza_film { char name_film ; char name_director ; char genre ; int...

Ошибка LNK2019 - ссылка на неразрешенный внешний символ
Доброго времени суток. При запуске выдается следующую ошибку: LNK2019 ссылка на неразрешенный внешний символ &quot;double __cdecl...

8
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
06.02.2017, 18:28
Лучший ответ Сообщение было отмечено Lepeshkaa как решение

Решение

Шаблоны нельзя компилировать в отдельном файле.
Поэтому содержимое cpp файла с определениями методов нужно вносить в h файл (как Вы и сделали).
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
06.02.2017, 18:29
Лучший ответ Сообщение было отмечено Lepeshkaa как решение

Решение

Цитата Сообщение от Lepeshkaa Посмотреть сообщение
Когда перенёс определение функций в сам заголовочный файл, то ошибок не было)
Так и нужно делать, иначе, в месте создания инстанса шаблона, компилятор не будет видеть реализацию шаблона.
1
 Аватар для Lepeshkaa
0 / 0 / 0
Регистрация: 06.01.2017
Сообщений: 51
06.02.2017, 18:37  [ТС]
Т.е. шаблоные функции должны быть определены ТОЛЬКО в одном файле с классом? и больше никак?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
06.02.2017, 19:03
Лучший ответ Сообщение было отмечено Lepeshkaa как решение

Решение

Цитата Сообщение от Lepeshkaa Посмотреть сообщение
Т.е. шаблоные функции должны быть определены ТОЛЬКО в одном файле с классом? и больше никак?
Если очень хочется, то можно и не в одном, но, в месте создания инстанса шаблона (в данном случае, в файле с main()), компилятор должен видеть и определения шаблона.
1
 Аватар для Lepeshkaa
0 / 0 / 0
Регистрация: 06.01.2017
Сообщений: 51
06.02.2017, 20:43  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Если очень хочется, то можно и не в одном, но, в месте создания инстанса шаблона (в данном случае, в файле с main()), компилятор должен видеть и определения шаблона.
Не понял, можно по подробнее. Что такое "инстанс" ?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
06.02.2017, 20:55
Цитата Сообщение от Lepeshkaa Посмотреть сообщение
можно по подробнее. Что такое "инстанс" ?
http://ipc.susu.ru/8504-4.html... aa3htb9e67
https://code-live.ru/post/cpp-template-functions/
1
 Аватар для Lepeshkaa
0 / 0 / 0
Регистрация: 06.01.2017
Сообщений: 51
07.02.2017, 02:07  [ТС]
Спасибо. Прочёл стало понятно. Вот только не понял эту строчку (выделена жирным).

"Инстанцирование шаблона – это генерация кода функции или класса по шаблону для конкретных параметров. Различают неявное инстанцирование, которое происходит при вызове функции или создании объекта класса, и явное инстанцирование с помощью резервированного слова template. Инстанцирование можно делать только в точке программы, где доступна реализация шаблона функции или методов шаблонного класса."
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
07.02.2017, 12:19
Цитата Сообщение от Lepeshkaa Посмотреть сообщение
Вот только не понял эту строчку (выделена жирным).
Об этом и разговор идёт.
Цитата Сообщение от nd2 Посмотреть сообщение
в месте создания инстанса шаблона (в данном случае, в файле с main()), компилятор должен видеть и определения шаблона.
То есть, если поместить и реализации шаблона в .h, и подключить его в файле с main(), то компилятор будет видеть нужное для создания инстансов шаблонов в main().
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.02.2017, 12:19
Помогаю со студенческими работами здесь

Ошибка LNK2019 ссылка на неразрешенный внешний символ
В заголовочном файле объявлен класс class cLogReader { public: cLogReader(int i) { }; ~cLogReader();

Ошибка LNK2019 ссылка на неразрешенный внешний символ
Ошибка LNK2019 ссылка на неразрешенный внешний символ &quot;void __cdecl sumArray(int * *,int * *,int,int)&quot; (?sumArray@@YAXPAPAH0HH@Z) в...

Ошибка LNK2019 ссылка на неразрешенный внешний символ
Переделывала целочисленнный Список в шаблон + добавила итераторы. но выходят эти ошибки,пофиксить не получается Ошибка LNK2019 ссылка...

Ошибка LNK2019 | Ссылка на неразрешенный внешний символ
Всем добрый день! При компиляции возникает ошибка LNK2019, не могу самостоятельно её отыскать. Помогите, пожалуйста, разобраться. ...

Ошибка LNK2019: ссылка на неразрешенный внешний символ
Уже который день не могу разобраться с этой проблемой! У меня есть класс Agent, с данными name, age и experience. Для того, чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru