Страниц: [1]
  Печать  
Автор Тема: кто виноват??  (Прочитано 5231 раз)
yakov
Гость
« : Октября 21, 2004, 11:07:25 pm »

Мизерный код не линкуется: (из серии че заа.. )
sock.cc:



#include <sys/types.h>
#include <sys/socket.h>

#include "sock.hh"

template<class Addr>
sock<Addr>::sock (int domain, int type,
        int protocol)
   : fail (false)
{
 
}
/*..*/


sock.hh:
#ifndef HDR
#define HDR




template<class Addr>
class sock
{

private:
  int sid;
  bool fail;

public:
  sock () {}
  sock (int domain, int type, int protocol = 0);

  void bind (Addr*);


  bool good () const;
  bool operator! () const;
};
#endif


test.cc:

#include "sock.hh"

int main (int argc, char* argv[])
{

  sock<char> sp2;


  sock<int> sp (0, 0);


  return 0;
}


Все это не имеет смысла. ОНО ДОЛЖНО собираться, вместо этого оно вылетает с:
[section212@darkstar IPC]$ g++ test.cc sock.cc
/tmp/ccJ5nWtZ.o(.text+0x2a): In function `main':
: undefined reference to `sock<int>::sock[in-charge](int, int, int)'
collect2: ld returned 1 exit status



[section212@darkstar IPC]$g++ -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.3.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --disable-libunwind-exceptions --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7)


Кто подскажет в чем дело?? Спасибо
Записан
bond
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #1 : Октября 22, 2004, 02:50:15 am »

единственное что могу предложить перенести функцию из
sock.cc в sock.hh и тогда, соответственно
g++ test.cc
или в конце sock.hh сделать #include "sock.cc"
(но первый вариант мне больше нравиться)
а почему, не получается в отдельном файле, потому что компилятор не знает при компиляции sock.cc что подставлять весто Addr
Записан
yakov
Гость
« Ответ #2 : Октября 22, 2004, 07:37:47 pm »

Оба файла компилятся на ура:
$g++ -c sock.cc
$g++ -c test.cc
НО ошибка возникает при попытке линковать их (*.o) вместе.

2bond

Как вариант работает если main сунуть в sock.cc
Все равно спасибо за помощь!!
Записан
yakov
Гость
« Ответ #3 : Октября 25, 2004, 08:06:01 pm »

Наверное потому что я так по-дурацки назвал ветку, в нее никто не постит

Сорцы не линкуются, тк надо добавлять export перед объявлением шаблона или определением, для того чтобы они могли линковаться из(с) разных единиц трансляции (см TCPPPG3 параграф 13.7). На мое счастье в gcc34 не реализовано export. Если кто-то знает насчет последних версий gcc, подскажите.

Спасибо
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #4 : Октября 26, 2004, 08:10:47 am »

yakov
Наверное потому что я так по-дурацки назвал ветку, в нее никто не постит

Вы меня простите, но это не из-за того, что ветка названа по-дурацки, а из-за того, что вопрос ламерский ...

RTFM C++

1) Вопрос на пять баллов: Что будет в объектнике, если скомпилить:

#include "sock.hh"

template<class Addr>
sock<Addr>::sock (int domain, int type, int protocol): fail (false)
{
}

1) Мой метод.
2) Весь класс sock.
3) Ничего (пустой объектник)

Самонаводящиеся вопросы:

1) Что будет в результате, если скомпилить g++ -c sock.hh Huh?
2) Если взять за аксиому: Темплейты разворачиваются во время компиляции, а не линковки, то что мы получим исходя из этой аксиомы ?

P.S.: Почитать первую рекомендацию bond'a и сделать как он сказал. Т.е. сделать по всем правилам. Если не понятно, читаем штандарт.
Записан

Страниц: [1]
  Печать  
 
Перейти в: