Компилируется, но .obj не содержит код!!!
От: Василий Сухачев Мухосранск  
Дата: 28.11.01 08:40
Оценка:
Вопрос скорее к знатокам MS Visual C++.

Почему если я выношу описания классов и реализацию в отдельные файлы (например AbstractItem.h и AbstractItem.cpp для класса AbstractItem) то компиляция проходит нормально но компоновщик выдает ошибки:
------------------
Test.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall Derived<class AbstractItem *>::~Derived<class AbstractItem *>(void)" (??1?$Derived@PAVAbstractItem@@@@UAE@XZ)
Test.obj : error LNK2001: unresolved external symbol "public: __thiscall Derived<class AbstractItem *>::Derived<class AbstractItem *>(class AbstractItem *)" (??0?$Derived@PAVAbstractItem@@@@QAE@PAVAbstractItem@@@Z)
------------------
Test.obj в данном случае содержит функцию main
Причем "dumpbin -symbols Derived.obj" выдает следующее
---------------------
Dump of file Derived.obj

File Type: COFF OBJECT

COFF SYMBOL TABLE
000 00000000 DEBUG notype Filename | .file
C:\Garbage\VCProj\Test\Derived.cpp
003 000B2306 ABS notype Static | @comp.id
004 00000000 SECT1 notype Static | .drectve
Section length 4B, #relocs 0, #linenums 0, checksum 0
Relocation CRC 00000000
007 00000000 SECT2 notype Static | .debug$S
Section length 2CF, #relocs 0, #linenums 0, checksum 0
Relocation CRC 00000000
00A 00000000 SECT3 notype Static | .debug$T
Section length 38, #relocs 0, #linenums 0, checksum 0
Relocation CRC 00000000

String Table Size = 0x0 bytes

Summary

2CF .debug$S
38 .debug$T
4B .drectve
---------------------
Почему не скомпилировались функции?
Когда все находится в одном файле все проходит нормально.
Использую Visual C++ v6.0 SP5.

Спасибо за внимание.
/В.Сухачев

Исходник:
---------------------------------------------
#include "stdafx.h" //Содержит #include <iostream.h>

//////////////////////////////////////////////////////////////
class AbstractItem
{
public:
AbstractItem();
virtual ~AbstractItem();
virtual int Get()=0;
};
AbstractItem::AbstractItem(){}
AbstractItem::~AbstractItem(){}
//////////////////////////////////////////////////////////////
class ConcreteItem : public AbstractItem
{
int m_i;
public:
ConcreteItem(int i);
ConcreteItem();
virtual ~ConcreteItem();
int Get();
};
ConcreteItem::ConcreteItem(){m_i=13;}
ConcreteItem::ConcreteItem(int i){m_i=i;}
ConcreteItem::~ConcreteItem(){}
int ConcreteItem::Get(){return m_i;}
//////////////////////////////////////////////////////////////
template <class T>
class Base
{
public:
Base();
virtual ~Base();
virtual T Get()=0;
};
template <class T> Base<T>::Base(){}
template <class T> Base<T>::~Base(){}
//////////////////////////////////////////////////////////////
template <class T>
class Derived : public Base<T>
{
T m_t;
public:
Derived(T t);
virtual ~Derived();
T Get();
};
template <class T> Derived<T>::Derived(T t){m_t=t;}
template <class T> Derived<T>::~Derived(){}
template <class T> T Derived<T>::Get(){return m_t;}
//////////////////////////////////////////////////////////////

int main(int argc, char* argv[])
{
ConcreteItem citem(25);
AbstractItem* aitem=&citem;
Base<AbstractItem*>* base;
Derived<AbstractItem*> derived(aitem);
base=&derived;
cout<<base->Get()->Get()<<endl;
return 0;
}
---------------------------------------------
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.