Подтвердить что ты не робот

Шаблоны С++, undefined ссылка

У меня есть функция, объявленная так:

template <typename T> 
T read();

и определяется так:

template <typename T>
T packetreader::read() {
    offset += sizeof(T);
    return *(T*)(buf+offset-sizeof(T)); 
}

Однако, когда я пытаюсь использовать его в моей функции main():

packetreader reader;
reader.read<int>();

Я получаю следующую ошибку из g++:

g++ -o main main.o packet.o
main.o: In function `main':
main.cpp:(.text+0xcc): undefined reference to `int packetreader::read<int>()'
collect2: ld returned 1 exit status
make: *** [main] Error 1

Может ли кто-нибудь указать мне правильное направление?

4b9b3361

Ответ 1

Вам нужно использовать ключевое слово export. Однако я не думаю, что у g++ есть надлежащая поддержка, поэтому вам нужно включить определение функции шаблона в заголовок, чтобы блок перевода мог его использовать. Это связано с тем, что <int> 'версия' шаблона не была создана, только версия <typename T>.

Простым способом является #include.cpp файл. Однако это может вызвать проблемы, например. когда другие функции находятся в файле .cpp. Это также, вероятно, увеличит время компиляции.

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

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

Ответ 2

Проблема заключается в том, что шаблон функции не является функцией. Это шаблон для создания функций по мере необходимости.

Итак, для работы шаблона компилятор интуитивно нуждается в двух фрагментах информации: сам шаблон и тип, который должен быть заменен на него. Это не похоже на вызов функции, который компилятор может генерировать, как только он знает, что функция существует. Ему не нужно знать, что делает функция, просто она выглядит как void Frobnicate(int, float), или как бы то ни было его подпись.

Когда вы объявляете шаблон функции без его определения, вы сообщаете только компилятору, что такой шаблон существует, но не так, как он выглядит. Этого недостаточно для того, чтобы компилятор смог создать его экземпляр, он также должен иметь возможность увидеть полное определение. Обычное решение состоит в том, чтобы поместить весь шаблон в заголовок, который может быть включен в случае необходимости.

Ответ 3

Наилучшей практикой с функциями шаблона является определение их в файлах заголовков. Они создаются во время компиляции, поэтому компилятор должен иметь определение вокруг, чтобы сделать это.

Если export для шаблонов будет более поддерживаться, это не так, но сейчас его вряд ли можно использовать.

Ответ 4

Является ли их какой-либо компилятор для поддержки компилятора отдельной компиляцией?

Как я знаю, обычная практика заключается в объявлении и реализации функций шаблона в файле заголовка