powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / templated funcrion
25 сообщений из 35, страница 1 из 2
templated funcrion
    #34054366
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ на так на вскидку может у кого была такая засада.
Короче в файле test1.cpp есть класс:
Код: plaintext
1.
2.
3.
4.
5.
class ToolBox
{
public:
	template <class T> 
		static void showArrayContent(T z);
};

далее я вызываю из файла test2.cpp эту функцию.
При линковке получаю:
Код: plaintext
undefined reference to `void ToolBox::showArrayContent<int>(int)'
Причем если я вызываю из этого класса нормальную (не тэмплэйд) функцию - все Ок. Следовательно библиотеки включены в последовательность в нужном порядке. В чем может быть проблема?
...
Рейтинг: 0 / 0
templated funcrion
    #34054443
IlichX86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если память мне не изменяет, то в стандарте C++ написано, что могут быть шаблонные классы и шаблонные функции, А шаблонного метода в обычном классе быть не может. Оно и логично, т.к. при использовании шаблонов работает препроцессор, только потом компилятор. В твоем случае препроцессор не обрабатывает "шаблонный метод", поэтому все валится. Причем валится, скорее всего, на этапе линковки, т.к. код оттранслировался нормально (синтаксических ошибок нет), а указатель на необходимую функцию получить не получается.
...
Рейтинг: 0 / 0
templated funcrion
    #34054457
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже сначала так думал, но после того как код откомпилился отбросил эту версию. Хотя твоё предположение все объесняет... Значит все таки нельзя... Ладно, пасиб.
...
Рейтинг: 0 / 0
templated funcrion
    #34054468
Если память мне не изменяет, то в стандарте C++ написано, что могут быть шаблонные классы и шаблонные функции, А шаблонного метода в обычном классе быть не может.

"Класс или шаблон класса может иметь члены, которые сами являются шаблонами. <...> Член шаблон не может быть виртуальным." Б.Стр., C++ 3изд., [13.6.2]
...
Рейтинг: 0 / 0
templated funcrion
    #34054480
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IlichX86Если память мне не изменяет, то в стандарте C++ написано, что могут быть шаблонные классы и шаблонные функции, А шаблонного метода в обычном классе быть не может

вполне может

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <iostream>

using namespace std;

class C
{
    public:
        template<typename T> static void f(T z);
};

template<typename T> void C::f(T z)
{
    cout << z;
}

int main()
{
    C test;
    test.f( 42 );
    test.f("\nhello\n");
    test.f( 3 . 14 );
    return  0 ;
}

Проблемы у автора скорее всего из-за того, что в test2.cpp шаблон просто не виден. Т.к. он должен использоваться в той же единице трансляции, где и объявлен - т.е. либо в том же .cpp файле, либо подключать .h файл
...
Рейтинг: 0 / 0
templated funcrion
    #34054493
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redskin
Проблемы у автора скорее всего из-за того, что в test2.cpp шаблон просто не виден. Т.к. он должен использоваться в той же единице трансляции, где и объявлен - т.е. либо в том же .cpp файле, либо подключать .h файл

В том же cpp нет возможности сделать, header я подключаю и похоже видит он его, потому что в противном случае заругался бы что функция не объявлена на этапе конпиляции...
...
Рейтинг: 0 / 0
templated funcrion
    #34054515
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bemtaill redskin
Проблемы у автора скорее всего из-за того, что в test2.cpp шаблон просто не виден. Т.к. он должен использоваться в той же единице трансляции, где и объявлен - т.е. либо в том же .cpp файле, либо подключать .h файл

В том же cpp нет возможности сделать, header я подключаю и

Если предполагается использовать шаблон в нескольких cpp файлах, то почему не перенести его реализацию в header, как обычно рекомендуют ведущие собаководы?
...
Рейтинг: 0 / 0
templated funcrion
    #34054520
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bemtaill redskin
Проблемы у автора скорее всего из-за того, что в test2.cpp шаблон просто не виден. Т.к. он должен использоваться в той же единице трансляции, где и объявлен - т.е. либо в том же .cpp файле, либо подключать .h файл

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

Шаблонные функции необходимо инстанцировать, а инстанцируются они, когда используются. Если ты будешь использовать функцию с типом int, то компилятор попробует найти ее определение и применить ей этот тип. Так как при компиляции модуля с шаблоном она не использовалась, то все ее определение в сипипишном файле никому оказалось не нужно. Когда же дошло дело до второго модуля, то компилятор увидел объявление, и сказал - гуд, линковщик ее найдет с нужным типом в каком нибудь модуле. Так как он сам от нее отказался при компиляции первого модуля, линковщик ее найти не смог.
...
Рейтинг: 0 / 0
templated funcrion
    #34054521
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redskin bemtaill redskin
Проблемы у автора скорее всего из-за того, что в test2.cpp шаблон просто не виден. Т.к. он должен использоваться в той же единице трансляции, где и объявлен - т.е. либо в том же .cpp файле, либо подключать .h файл

В том же cpp нет возможности сделать, header я подключаю и

Если предполагается использовать шаблон в нескольких cpp файлах, то почему не перенести его реализацию в header, как обычно рекомендуют ведущие собаководы?

Насколько я понимаю, так не только рекомендуют, а делают постоянно.
...
Рейтинг: 0 / 0
templated funcrion
    #34054533
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhНасколько я понимаю, так не только рекомендуют, а делают постоянно.

Ну можно ради смеха и в каждом .cpp свою реализацию писать :)
...
Рейтинг: 0 / 0
templated funcrion
    #34054546
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, так и сделаю...
...
Рейтинг: 0 / 0
templated funcrion
    #34054597
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redskin AkhНасколько я понимаю, так не только рекомендуют, а делают постоянно.

Ну можно ради смеха и в каждом .cpp свою реализацию писать :)

Возникла мысль, как он будет тогда линковать. Немного протестировал, мне показалось, что берет первое попавшееся инстанцирование. Надо будет в понедельник это дело посмотреть получше...
...
Рейтинг: 0 / 0
templated funcrion
    #34054791
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему бы не спрятять реализацию в какой-нибудь cpp и сделать явную инстанциацию метода для всею необходимых типов?
...
Рейтинг: 0 / 0
templated funcrion
    #34055785
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedА почему бы не спрятять реализацию в какой-нибудь cpp и сделать явную инстанциацию метода для всею необходимых типов?
А как это? Можно поподробнее/примерчик? Не совсем понял, что значит инстанциировать метод для всех необхрдимых типов...
...
Рейтинг: 0 / 0
templated funcrion
    #34055877
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это очень просто
template<>
void ToolBox::ShowArrayContent<int>(int);
Вот тогда модуле п оявляется код соотвествующей фукции, независимо от того юзаешь ты ее или нет.
в твоем случае что происзодит? Компилятор видит декларациб статического матода, но почему-то не видит определения, по-видимому само определение где-то в cpp файле. А поэтому он не делает инстанциации щаблона там, где ты его используещь. Но это не ошибка, потому что стандарт предполагает вот такое ручное управление инстанциацией. а линкер он тупой - вот есть функция, а кода ее нет ну вот тебе и баг.
А решения 3
1 вытащить определение в h файл
2 явно инстанциировать
3 достать компилчтор с базой данных щаблонов. например Sun Workshop такое бы сжевал
...
Рейтинг: 0 / 0
templated funcrion
    #34055886
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedА это очень просто
template<>
void ToolBox::ShowArrayContent<int>(int);
Вот тогда модуле п оявляется код соотвествующей фукции, независимо от того юзаешь ты ее или нет.
в твоем случае что происзодит? Компилятор видит декларациб статического матода, но почему-то не видит определения, по-видимому само определение где-то в cpp файле. А поэтому он не делает инстанциации щаблона там, где ты его используещь. Но это не ошибка, потому что стандарт предполагает вот такое ручное управление инстанциацией. а линкер он тупой - вот есть функция, а кода ее нет ну вот тебе и баг.
А решения 3
1 вытащить определение в h файл
2 явно инстанциировать
3 достать компилчтор с базой данных щаблонов. например Sun Workshop такое бы сжевал

Спасибо, буду знать...
...
Рейтинг: 0 / 0
templated funcrion
    #34056229
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded Но это не ошибка, потому что стандарт предполагает вот такое ручное управление инстанциацией. а линкер он тупой - вот есть функция, а кода ее нет ну вот тебе и баг.

А что говорит стандарт, на счет того, что когда встречаются 2-е инстанциации, то линкер выбирает из них первую попавшуюся, с не ругается, что их две?
...
Рейтинг: 0 / 0
templated funcrion
    #34056304
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не помню, надо посмотреть.
...
Рейтинг: 0 / 0
templated funcrion
    #34056319
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedне помню, надо посмотреть.

Опять же это для чего-то сделано (как и отмена при наследовании перегруженных функций по умолчанию), просто интересно - зачем?
...
Рейтинг: 0 / 0
templated funcrion
    #34056970
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полная анархия. стандарт говорит что бывает инстанциация неявная и явная. дальше начинаются изголяшества разработчиков. Ну с явной (explicit) все понятно. А вот с неявной все сложнее, как правило все умеют делать неявную подстановку когда в каждрм объектнике сноя копия кода для инстанциированных в нем методов, они различаются по именам и поэтому при линковке никаких проблем но размео исполняемого модуля "великоват". дальше у кого чего
у aCC (HP) есть ключик, когда компилер генерит для каждого объектика свое определения, а потом линкер берет первое попавшееся, правда преимущество имеет явная инстанциация, ежели она есть
у SUNWorkshop - ключик для создания БД шаблонов. Он делает временную поддиректорию в которую комнилятор складывает инстанциированные методы, а потом при линкоке их оттуда вытаскивает. кстати для сборки библиотеки нельзя пользоваться обычным ar, только компилером
у IBM чтобы попользоваться БД шаблонов надо не только ключи компилеру указать, но и явно показать на файлы где находятся определения шаблонных методов.
Akh! Я понимаю что чукча не читатель, а писатель но купи седе книжку трупа страуса про С++. Там тебе объяснят что это из-за множественного наследования, вдруг ты решишь отнаследоваться от двух классов у каждого из которых есть метод foo(int). Вот чтобы это было можно ответственность свалили на программера.
...
Рейтинг: 0 / 0
templated funcrion
    #34057063
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedAkh! Я понимаю что чукча не читатель, а писатель но купи седе книжку трупа страуса про С++. Там тебе объяснят что это из-за множественного наследования, вдруг ты решишь отнаследоваться от двух классов у каждого из которых есть метод foo(int). Вот чтобы это было можно ответственность свалили на программера.

У меня сейчас банда четырех стоит приоритетом, так я и эту задачу не могу возобновить.

Вообщем, действительно полная анархия. Чето-то я думал, что при множественном наследовании, предки не должны иметь одинаковые public/protected методы или могут иметь, но их надо вызывать с явным указанием предка...
...
Рейтинг: 0 / 0
templated funcrion
    #34058080
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот ты и ошибаешься. Могут иметь, причем разрешить неоднозначность призван рограммер пишущий класс-наслндник.
...
Рейтинг: 0 / 0
templated funcrion
    #34058255
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedА вот ты и ошибаешься. Могут иметь, причем разрешить неоднозначность призван рограммер пишущий класс-наслндник.

А если не разрешит, то ему подсунут, что попало?
...
Рейтинг: 0 / 0
templated funcrion
    #34059868
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НЕ угадал, он как и ты в наследнике не увидит, методов в наследнике.
...
Рейтинг: 0 / 0
templated funcrion
    #34060062
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedНЕ угадал, он как и ты в наследнике не увидит, методов в наследнике.

Хорошо. Имеет класс 2 одинаковых метода, полученных множественным наследованием или 2-х инстанциацией. Если это первый случай, то методы не видны и их надо явно прописывать через класс-предок, который их предоставил. А если это 2-й случай, то методы все видны, ибо они порождены от одного класса и указать явно, какой инстанциаций надо пользоваться нет возможности. Но это являестя противоречием, которое должен отлавливать линковщик. а он этого не делает.
Раз уж при множественном наследовании можно и нужно указывать конкретный класс предок при использовании метода, а в инстанциации нет такой возможности, то при чем тут множественное наследование, раз уж мы говорим про множественную инстанциацию?
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / templated funcrion
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]