Синтаксис специализации шаблона функции для файла cpp - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть шаблонная функция, объявленная в моем .h и реализованная в моем .cpp:

//file.h
class FileReader{
template <class T> void Read( T *aValue );
};

//file.cpp
template<class T>
void
FileReader::Read( T *aValue )
{
    //implementation
}

Чтобы разрешить реализацию в моем .cpp, у меня было

template void FileReader::Read<uint8_t>( uint8_t * );
template void FileReader::Read<uint16_t>( uint16_t * );

Нопытаясь решить проблему с кислородом, кто-то указал мне здесь , что я должен использовать

template<> void FileReader::Read<uint8_t>( uint8_t * );
template<> void FileReader::Read<uint16_t>( uint16_t * );

Это действительно исправляет проблему с кислородом, но это нарушает мою компиляцию при связывании.

=> Каков правильный синтаксис, чтобы специализировать мой шаблон функции в моем .cpp и разрешить связывание функции?

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

1 Ответ

0 голосов
/ 14 ноября 2018

Правильный синтаксис зависит от того, что вы на самом деле пытаетесь сделать. Добавление <> - это НЕ просто способ исправить Doxygen - это существенно меняет смысл программы!

Ниже приведены явные определения экземпляров :

template void FileReader::Read<uint8_t>( uint8_t * );
template void FileReader::Read<uint16_t>( uint16_t * );

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

Ниже приведены явные объявления специализации :

template<> void FileReader::Read<uint8_t>( uint8_t * );
template<> void FileReader::Read<uint16_t>( uint16_t * );

Они сообщают компилятору, что вы собираетесь определить свои собственные специализации шаблона для этих конкретных аргументов шаблона. Таким образом, любой, кто пытается вызвать FileReader::Read<uint8_t>, НЕ будет создавать экземпляр первичного шаблона, который вы уже определили, а искать специальное определение. Не похоже, что это то, что вы пытаетесь сделать, но если бы это было так, вам бы действительно пришлось определить эти специализации в какой-то момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...