Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > LNK2001: unresolved external symbol


Автор: iSpite 13.5.2010, 22:31
есть файл 001.cpp
Код

#include "rectangle.h"
void rec()
{
тут я работаю с классом
}
void main (void)
{
rec;
}

в rectangle.cpp 
Код

#include "rectangle.h"

реализация методов класса

в rectangle.h
Код

#include <iostream>
#include <cmath>
using namespace std;

#define PI 3.14159265
#if !defined RECTANGLE
#define RECTANGLE

template <class TD>
class rectangle
{
public:
private:
};
#endif


описал класс было всё ОК. 
при попытке описать шаблон выдал ошибку линковки подскажите как исправить.

Автор: Alexeis 13.5.2010, 22:35
  Шаблоны в заголовочных файлах описывать нужно. Нету пока что настолько умных компиляторов С++, что скомпилить всего одну реализацию и потом инстанциировать по бинарнику. Компилятор хочет видеть всю реализацию в заголовке. Возможно со временем компиляторы поумнеют и справятся с этой задачей.

Автор: toxx 13.5.2010, 22:37
unresolved external symbol означает, что нигде линковщик не может найти определение чего-либо(функции, метода). 

Автор: iSpite 13.5.2010, 22:44
Цитата(Alexeis @ 13.5.2010,  22:35)
Шаблоны в заголовочных файлах описывать нужно. Нету пока что настолько умных компиляторов С++, что скомпилить всего одну реализацию и потом инстанциировать по бинарнику. Компилятор хочет видеть всю реализацию в заголовке. Возможно со временем компиляторы поумнеют и справятся с этой задачей.


так что добавить в заголовок??? как описать?

Автор: djamshud 13.5.2010, 22:58
iSpite, все писать в хедере. Или сделать в нем include"rectagle.cpp". Второй вариант иногда используется, но лично я его не люблю.

Автор: Alexeis 13.5.2010, 23:00
Цитата(iSpite @  13.5.2010,  21:44 Найти цитируемый пост)
так что добавить в заголовок??? как описать? 

  Все что есть цппшнике закинуть в заголовочный файл где описан шаблон. Компилятору чтобы все разрулить нужен полный исходник. цпп файл дает обж, который можно только слинковать. Линкер не умеет линковать реализацию шаблона, поэтому это должен делать компилятор. Компилятор должен на каждый цппшник где используется шаблон сгенерить свою реализацию по коду из заголовка. Потом линкер объединить одинаковые реализации, но это уже не имеет отношения к вопросу

Автор: iSpite 13.5.2010, 23:08
Цитата(djamshud @ 13.5.2010,  22:58)
iSpite, все писать в хедере. Или сделать в нем include"rectagle.cpp". Второй вариант иногда используется, но лично я его не люблю.

не годиться =(
C1076: compiler limit : internal heap limit reached
пишет что в бесконечную рекурсию уходит
писать всё в хэдере нельзя условие л\р

Автор: Alexeis 13.5.2010, 23:13
  Тогда опиши тайпдефами всевозможные подстановки типов. Весь код не нужно переносить в заголовки. Нужно переносить только реализацию шаблонов. Код использующий шаблоны может быть где угодно.

Автор: djamshud 13.5.2010, 23:19
iSpite, почитате про препроцессор.

Код

#ifndef blablabla
#define blablabla

template<typename T>
....

#include"blablabla.cpp"

#endif


Код

#include"blablabla.h"

...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)