Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с шаблонами

2.9K
18 мая 2004 года
Antisly
58 / / 22.04.2004
При вызове функции-шаблона, определенной в другом модуле, во время линкования вылетает ошибка "Unresolved external MY_FUNCTION referenced from MY_MODULE". Если функцию определить в заголовочном файле - все нормально.
Вроде бы шаблоны - вещь простая, но разобраться, в чем тут дело, не могу.
Вопрос: В чем проблема? Либо нужны какие-то дополнительные ключевые слова (типа export. Кстати, в хэлпе говорится следующее "The export keyword is reserved for future implementation, but has no effect in this release"), либо так и должно быть.
P.S. Прошу прощения за ламерский вопрос.
6.0K
18 мая 2004 года
Porphirius
19 / / 12.05.2004
Цитата:
Originally posted by Antisly
При вызове функции-шаблона, определенной в другом модуле, во время линкования вылетает ошибка "Unresolved external MY_FUNCTION referenced from MY_MODULE". Если функцию определить в заголовочном файле - все нормально.



Ты по всей видимости не подключил файл реализации (*.cpp) к своему проекту. Project -> Add file - так если не ошибаюсь

Цитата:

Вроде бы шаблоны - вещь простая, но разобраться, в чем тут дело, не могу.


шаблоны тут абсолютно не причем... попробуй любую другую функцию реализовать в том сpp-файле...получишь тот же резалт

Цитата:

Вопрос: В чем проблема? Либо нужны какие-то дополнительные ключевые слова (типа export. Кстати, в хэлпе говорится следующее "The export keyword is reserved for future implementation, but has no effect in this release"), либо так и должно быть.


ничего не нужно... export вааще тут не причем =))
Кстати проблемы сборки проектов с множеством цпп-файлов, то бишь проблемы раздельной линковки, обсуждаются в любом учебнике по цпп... читай внимательнее ;)

Цитата:
P.S. Прошу прощения за ламерский вопрос.


Извинений не нужно :) ...собственно форумы и предназначены ...для того чтобы на них задавали
вопросы... все мы ламеры, только в разной степени ;)

7.0K
19 мая 2004 года
Biomen
11 / / 19.05.2004
Цитата:
Originally posted by Porphirius


Ты по всей видимости не подключил файл реализации (*.cpp) к своему проекту. Project -> Add file - так если не ошибаюсь


шаблоны тут абсолютно не причем... попробуй любую другую функцию реализовать в том сpp-файле...получишь тот же резалт

;)



На сколько помню, шаблоны вообще должны быть полностью в заголовочных файлах.

2.9K
19 мая 2004 года
Antisly
58 / / 22.04.2004
Цитата:
Originally posted by Porphirius

Извинений не нужно :) ...собственно форумы и предназначены ...для того чтобы на них задавали
вопросы... все мы ламеры, только в разной степени ;)


Может быть я и ламер, но не втакой же степени ;-). Само собой, модуль к проекту был подключен. Скорее всего, прав Biomen.

3
19 мая 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Antisly

Может быть я и ламер, но не втакой же степени ;-). Само собой, модуль к проекту был подключен. Скорее всего, прав Biomen.



Шаблонные методы или методы шаблонного класса будут скомпилированы только тогда, когда этот шаблон будет инстанирован конкретными аргументами. Поэтому нет смысла выносить их в отдельный cpp, т.к. они все равно не будут скомпилированы (есть конечно export, но он не поддерживается большинством компиляторов). Шаблонные методы должны быть определены в том же cpp, либо подключены к cpp, где они будут инстанированы.

2.0K
19 мая 2004 года
Fazil6
126 / / 17.12.2003
мы не можем разделить объявление и реализацию шаблона функции, как в случае с обычными функциями
3
19 мая 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Fazil6
мы не можем разделить объявление и реализацию шаблона функции, как в случае с обычными функциями



Да ну?! :}

 
Код:
// header.h

// Объявление
template<class T> T func(T arg);


Код:
#include "header.h"

int main(int argc, char* argv[])
{
    int i = func(5); // инстанирование + вызов
}

// реализация (определение)
template<class T>
T func(T arg)
{
    return arg;
}


Повторюсь: шаблонный метод должен быть определен в том же cpp (непосредственно, либо по средством #include), где и инстанирован.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог