Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2012, 12:39   #1
Arrioh
Пользователь
 
Регистрация: 25.03.2012
Сообщений: 60
Печаль error LNK2019. why?

Не понимаю почему выбивает LNK2019. Код:
Код:
#ifndef _STACK_H
#define _STACK_H
#include <iostream>
using namespace std;

template <class Type>
class stack
{
private:
  int top;
  Type s[10];

public:
  stack();

  void push(Type var);

  void pop();
};



#endif
Код:
#include "stack.h"

template <class Type>
stack<Type>::stack()
{
	top = 0;
}
template <class Type>
void stack<Type>::push(Type var)
{
	top++;
    s[top] = var;
}
template <class Type>
void stack<Type>::pop()
{
	top--;
}
Код:
#include <iostream>
#include "stack.h"

using namespace std;
int main()
{
	stack<int> a;
	a.push(1);

}

Последний раз редактировалось Arrioh; 19.12.2012 в 12:46.
Arrioh вне форума Ответить с цитированием
Старый 19.12.2012, 12:46   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Шаблоны не компилируются. Теоретически, они могут это делать (ну... в некотором роде) при использовании ключевого слова export; практически, есть совет описывать шаблонный класс целиком в заголовке.
Abstraction вне форума Ответить с цитированием
Старый 19.12.2012, 12:47   #3
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Определения шаблонных методов должны лежать в хедере.
Son Of Pain вне форума Ответить с цитированием
Старый 19.12.2012, 19:28   #4
Arrioh
Пользователь
 
Регистрация: 25.03.2012
Сообщений: 60
По умолчанию

Спс за ответы. Извините за "а за деревом дерево", но все же задался вопросом: почему так? Почему нельзя раскидать по .h + .cpp как мы делаем это с классами? И пока самостоятельно не нашел конкретного ответа. Буду благодарен если объясните.
Arrioh вне форума Ответить с цитированием
Старый 19.12.2012, 21:37   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Почему нельзя раскидать по .h + .cpp как мы делаем это с классами?
Чем .cpp-файл отличается от .h-файла, и зачем вообще нужно деление на файлы? Дело в том, что в случае большого проекта перекомпилировать его целиком при каждом мелком изменении уже становится весьма накладно, поэтому проект бьётся на модули, которые компилируются в "почти" бинарный код, а для окончательной сборки наружу "смотрят" заголовки - те самые .h-файлы. Они должны нести всю информацию, требуемую для аналогичной "предварительной" компиляции других .cpp-файлов.

К примеру. Пусть у нас есть заголовочный файл CommonClass.h, который объявляет класс CommonClass. Объявление (обратите внимание!) однозначно задаёт, скажем, размер объекта класса, так что в любом модуле можно написать
Код:
#include "CommonClass.h"

//...
CommonClass array[12];
И компилятор прекрасно понимает, руководствуясь информацией из CommonClass.h, сколько места надо отвести под переменную array и как "внутри" неё найти какие-либо поля класса CommonClass.

А теперь:
Код:
#include "stack.h"

//...
stack<int> someObject;
stack<double> otherObject;
stack<stack<char*> > thirdObject;
Дела несколько осложнились, не правда ли? Мы потребовали существования четырёх разных классов: их объекты имеют разный размер; сами они имеют методы с разными сигнатурами и разным кодом. И таких классов потенциально может быть порождено сколь угодно много, а значит, их придётся "докомпилировать" по месту. Теоретически возможно, тем не менее, сделать некоторую "заготовку", пригодную для использования в других модулях на некотором промежуточном этапе компиляции (и, как уже сказано, стандарт C++ предусматривал для этого ключевое слово export). Но сложность возникающих при этом задач оказывается слишком высокой. До принятия стандарта C++11 единицы компиляторов поддерживали эту возможность, а новый стандарт вообще устраняет её из языка, оставляя export ключевым (зарезервированным) словом, не несущим смысла.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при компиляции: error LNK2019: unresolved external symbol ArmanPrestige Общие вопросы C/C++ 2 25.11.2012 22:04
sqlite3 error LNK2019: unresolved external symbol alex161 C/C++ Базы данных 2 04.02.2012 13:23
error LNK2019 Shnutser Общие вопросы C/C++ 5 24.05.2010 23:03
error LNK2019... Drakon4ek Общие вопросы C/C++ 0 29.03.2010 11:42
Ссылка на неразрешенный внешний символ(error LNK2019) TheWanderer Общие вопросы C/C++ 2 07.08.2009 19:58