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

LNK2019 при вызове метода в отдельном файле

10.11.2015, 13:13. Показов 1102. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте! У меня такая проблема- линкер жалуется на:
C
1
error LNK2019: unresolved external symbol "public: char * __thiscall Param<char *>::getName(void)" (?getName@?$Param@PAD@@QAEPADXZ) referenced in function _main
Интерфейс класса находится в .h файле, реализация - в .cpp файле. Используются шаблоны. Прошу помочь разобраться, т.к. до меня не доходит, что я делаю не так.

conf.h:
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
// conf.h
#ifndef CONF_H
#define CONF_H
#include <cstring>
 
template <typename T>
class Param{
private:
    char* name_;
    T state_;
public:
    Param *next, *prev, *head, *tail;
    Param();
    Param(char *, T);
    ~Param();
    void set(char *, T);
    void setState(T);
    void setName(char *);
    char* getName();
    T getState();
    void add(char *, T);
    void addlst(Param<T>*);
    Param<T>& operator=(Param<T>&);
    Param<T>& operator[](unsigned int);
};
#endif
conf.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// conf.cpp
#include "StdAfx.h"
#include "conf.h"
 
 
/* class Param */
 
// Конструктор по умолчанию
template <typename T>
Param<T>::Param(){
    name = "default";
    next = NULL;
    prev = NULL;
    head = NULL;
    tail = NULL;
    switch(typeid(state)){
        case typeid(int):{
            state_ = 0;
            break;
        }
 
        case typeid(char):{
            state_ = "default";
            break;
        }
 
        case typeid(bool):{
            state_ = false;
            break;
        }
 
        default:{
            state_ = NULL;
            break;
        }
    }
}
 
 
// Конструктор с входными данными
template <typename T>
Param<T>::Param(char* name, T state){
    state_ = state;
    name_ = name;
    next = NULL;
    prev = NULL;
    head = NULL;
    tail = NULL;
}
 
 
 
// Деструктор
template <typename T>
Param<T>::~Param(){
    while (head){ //Пока по адресу на начало списка что-то есть
        tail = head->next; //Резервная копия адреса следующего звена списка
        delete head; //Очистка памяти от первого звена
        head = tail; //Смена адреса начала на адрес следующего элемента
    }
}
 
 
 
// Метод установки названия и значения параметра
template <typename T>
void Param<T>::set(char* name, T state){
    state_ = state;
    name_ = name;
}
 
 
 
// Метод установки названия параметра
template <typename T>
void Param<T>::setName(char* name){
    name_ = name;
}
 
 
 
// Метод установки значения параметра
template <typename T>
void Param<T>::setState(T state){
    state_ = state;
}
 
 
 
// Метод  получения названия параметра
template <typename T>
char* Param<T>::getName(){
    return name_;
}
 
 
 
// Метод получения значения параметра
template <typename T>
T Param<T>::getState(){
    return state_;
}
 
 
 
// Перегрузка оператора присваивания
template <typename T>
Param<T>& Param<T>::operator=(Param<T>& right){
    if(this == &right){
        return *this;
    }
    name_ = right.getName()
    state_ = right.getState()
    return *this;
}
 
 
 
// Перегрузка оператора индексирования
template <typename T>
Param<T>& Param<T>::operator[](unsigned int num){
    Param<T> *tmp = new Param<T>();
    tmp = head; // Указатель на начало списка
    for(unsigned int i = 0; i <= num; i++){
        tmp = tmp->next;
    }
    return *tmp;
}
 
 
 
// Метод добавления параметра в конец списка
template <typename T>
void Param<T>::add(char* name, T state){
    Param<T> *tmp = new Param<T>(name, state);
    next = tmp;
}
 
 
 
// Метод добавления группы параметров в конец списка
template <typename T>
void Param<T>::addlst(Param<T>* tmp){
    next = tmp;
}

main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdafx.h"
#include "conf.h"
#include <conio.h>
#include <iostream>
using namespace std;
 
 
void main(){
    Param<char*> param("lol","tru");
    param.add("sda","sda");
    param.add("sdf","hds");
    _getch();
}
Добавлено через 10 минут
Забыл написать: использую VS2005.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.11.2015, 13:13
Ответы с готовыми решениями:

Что означает первый параметр метода этого класса? И почему при вызове метода передаётся один параметр(второй)?
public static HelpPageApiModel GetHelpPageApiModel(this HttpConfiguration config, string apiDescriptionId)

Ошибка при вызове метода
Выдает ошибку в строке Ferma.ask(); хочу чтобы при запуске программы писало строчку, а потом обращался к классу Ferma, каждый раз, а из...

Ошибка при вызове метода
Только начал учить С#, попробивал запустить вот такой простой код. using System; using System.Collections.Generic; using...

1
529 / 432 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
10.11.2015, 13:15
Цитата Сообщение от anwender95 Посмотреть сообщение
реализация - в .cpp файле
Так как у тебя шаблон, то реализация его должна быть в заголовочном файле. Потому что сначала компилятор скомпилирует тебе твой .cpp с шаблоном, а потом уже основной .cpp и попробует два файл слинковать. А так как во время компиляции conf.cpp, компилятор не в курсе, с какими типами и где ты его собрался инстанцировать, то никакой реализации скомпилировано не будет. Перенеси в .h.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2015, 13:15
Помогаю со студенческими работами здесь

Ошибка при вызове метода
Всем доброго утречка! Такой вот код написала, где программно создаю и хочу провести, но выдаёт ошибку ...

Ошибка при вызове метода
Не пойму в чем ошибка... #include &lt;vector&gt; #include &lt;iostream&gt; template &lt;typename T&gt; class Beast { public: int x; ...

Ошибка при вызове метода
добрый вечер. Сделал задание в Си# теперь его надо перевести в Java. Вот привожу отрывок кода как сделать чтоб он заработал. ошибки в ...

Ошибка при вызове метода
Доброго времени суток. Где-то в файле mainwindow.cpp в слоте я пишу: DraftsmanCube::diagonalA_C(); В этом методе diagonalA_C...

Ошибка при вызове метода класса, при чтении из файла
добрый день, пытаюсь считать данные из и запихнуть их в список в файле у меня вот такие данные a01 b10 А и Б надо запихнуть в...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru