Могут ли шаблонные специализации быть в моем .cpp? - PullRequest
0 голосов
/ 25 октября 2018

Допустим, у меня есть это:

struct foo {
    template <typename T>
    void bar(const T param) { cout << param << endl; }
};

Теперь я хочу добавить специализацию:

template <>
void bar<char>(const char param) { cout << static_cast<int>(param) << endl; }

Могу ли я просто добавить объявление в заголовок, что fooобъявлено в и определение bar<char> в файле реализации foo реализовано в?


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

1 Ответ

0 голосов
/ 25 октября 2018

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

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

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

...