The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"C++ templates и линковка"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"C++ templates и линковка"  
Сообщение от Аноним email(??) on 05-Авг-08, 10:36 
Имеется следующий код:

test.h:
template <typename T>
class A
{
public:
    T func();
};

test.cpp:
#include "test.h"

template <typename T>
T A<T>::func()
{
    return 0;
}

t.cpp:
#include "test.h"

int main()
{
    A<int> a;
    a.func();
    return -1;
}

SConstruct:
Program('test', ['t.cpp','test.cpp'], CCFLAGS="")

собираю с помощью scons. вывод:
slon@slon test $ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o t.o -c t.cpp
g++ -o test.o -c test.cpp
g++ -o test t.o test.o
t.o: In function `main':
t.cpp:(.text+0x18): undefined reference to `A<int>::func()'
collect2: ld returned 1 exit status
scons: *** [test] Error 1
scons: building terminated because of errors.

Почему линкер не находит функцию func? Видимо необходимы какие-то особые параметры линковки/компиляции? Если перенести определение функции в класс - всё замечательно. Гугл и маны мне не помогли, вся надежда на совет. Заранее спасибо :)

Компилятор: gcc (GCC) 4.1.2 (Gentoo 4.1.2)
Линкер: GNU ld (GNU Binutils) 2.18

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "C++ templates и линковка"  
Сообщение от const email(??) on 05-Авг-08, 13:54 
Вопрос на засыпку: что получается в объектном файле test.o?
Самый простой способ избежать проблемы - писать шаблон вместе с реализацией в одном заголовочном файле, т. е. файла test.cpp вообще не должно быть. Подробности - в гугле и книжках. :)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "C++ templates и линковка"  
Сообщение от from_mars on 06-Авг-08, 03:46 
>Самый простой способ избежать проблемы - писать шаблон вместе с реализацией в
>одном заголовочном файле, т. е. файла test.cpp вообще не должно быть.

Да, все в .h файле. Почему хз, где-то написано.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "C++ templates и линковка"  
Сообщение от Vladyslav Lazarenko email on 06-Авг-08, 04:51 
Добрый день. То, о чем Вы говорите, называется external template. К сожалению, эта часть стандарта не реализована С++ большинством компиляторов, по этому так писать не принято. Полное описание проблемы и её решения на английском языке Вы можете прочесть тут - http://www.codeguru.com/forum/showthread.php?t=250284
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "C++ templates и линковка"  
Сообщение от JustSlon on 08-Авг-08, 11:27 
>Добрый день. То, о чем Вы говорите, называется external template. К сожалению,
>эта часть стандарта не реализована С++ большинством компиляторов, по этому так
>писать не принято. Полное описание проблемы и её решения на английском
>языке Вы можете прочесть тут - http://www.codeguru.com/forum/showthread.php?t=250284

Большое спасибо =) Собственно, что и требовалось узнать.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру