LINUX.ORG.RU

Проблема со сборкой шаблонов...


0

0

Ситуация всем известная....

templ.h:
#ifndef __TEMPL_H
#define __TEMPL_H

template <class data_t> class templ{
data_t data;

public:
templ(data_t t);
data_t get(){ return data; }
};

#endif
============================================================
templ.cc:
#include "templ.h"

template <class data_t> templ<data_t>::templ(data_t t){
data = t;
}

=============================================================
test.cc:
#include <iostream>

#include "templ.h"

using namespace std;

int main(){

templ <int> t(10);

cout << t.get() << endl;

return 0;
}
=============================================================
Makefile:

OBJS = templ.o test.o
BINS = test

CC = g++
OPTIONS = -Wabi
.PHONY = all clean

all: $(BINS)

test: $(OBJS)
$(CC) $(OPTIONS) -o test $(OBJS)

templ.o: templ.h

test.o: templ.h

clean:
rm -f $(OBJS) $(BINS) *~
=============================================================

Если я это буду компилить впрямую, то получу мессагу:
$ make
g++ -c -o templ.o templ.cc
g++ -c -o test.o test.cc
g++ -Wabi -o clist templ.o test.o
test.o(.text+0x1a): In function `main':
: undefined reference to `templ<int>::templ[in-charge](int)'
collect2: ld returned 1 exit status
make: *** [clist] Error 1
$

Я обычно спрвалялся с этим методом дописывания в templ.cc следующего:
void __gccbug(){
templ <int> nw(1);
}
И так для каждого типа, или вообще описывая функции в h-нике.

Но вот как я это универским преподам буду объяснять (у нас сейчас курс ООП)? ;) Запихнуть в h-файл нельзя - "неправильное формирование рабочих файлов" ;)). И остваить функцию __gccbug тоже нельзя. :( Может опция какая-то к gcc есть или какой-нить другой солюшен? Помогите пожалуйста.

> Запихнуть в h-файл нельзя - "неправильное формирование рабочих файлов"
Да ну? Наверное именно поэтому в Qt все шаблонные классы (QList, ...)
написаны именно так, полностью в одном .h файле :)

IMHO нету другого способа решить данную задачу, кроме описанных Вами, если кто покажет (желательно не gcc-specific) - будет здорово

phoenix ★★★★
()

по идее "правильно" использовать ключевое слово export но оно нигде не реализовано. Более того -- те, кто пытались реализовать написали общее письмо где описывают огромное кол-во проблем и просят исключить export из стандарта.

dilmah ★★★★★
()

Классическая ситуация "Коль все знающиее С++ ушли на фронт то учить вас буду Я" ;-)))

Насколько я помню С++ то там допустил ошибку, а именно запихнул ОБЬЯВЛЕНИЕ в файл *.cc следственно оно нигде не видно. Можешь в нужном месте сделать "#include <templ.cc>".Хотя ето костыль. ;-))))

обьявления всех шаблонов ОБЯЗАНО находится в ХИДЕРЕ.

В *.сс можешь запихнуть конкретизацию шаблона или как её там зовут. В таком случае компилер сгенерирует реальный обьектный код который будеть обнаружен и использован линкером.

текущее содержимое templ.cc не приводит к генерации вообще никакого кода. Следственно линкер ничё ненаходит.

В качестве хорошего примера и аргумента преподу посмотри содержимое <complex> (<complex.h>)

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.