c++. явная специализация шаблона класса

xoki87

допустим, что есть шаблон класса и есть явная специализация этого шаблона. Допустим, что мы имеем определение и объявлеия обоих классов. вопрос 1. должны ли шаблон и явная специализация находиться в одном зрголовочном файле? Вопрос 2. можно ли определить методы явной специализации в сpp файле?

elenangel

1. нет
2. технически может получиться, но лучше так не делать, у меня после обновления компилятора такой код стал работать по другому - вместо явной специализации стала подцепляться дефолтная.

bigbill

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

elenangel

Не знаю насколько это общепринято, но я делаю специализацию там же, если предполагаю что это будет часто используемый случай и тип для специализации - широко распространенный и всем известный, например специализация для шаблона для параметра std::vector.
Или же размещаю в разных файлах если шаблон универсальный, а специализация для какого-то частного случая для класса специфичного для какой-то одной подсистемы проекта. Просто из соображений чтоб при использовании шаблона минимизировать зависимости от других классов.
Например, спецобработка класса IpAddress в шаблоне формирования форматированных строк - если разместить в одном файле, то все использующие формирование получат зависимость от класса IpAddress и этот шаблон еще пол сетевой системы притащит за собой.

Serab

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

xoki87

имелось в виду, обшепринятый подход среди девелоперов

Serab

Ну я же описал ситуации, когда может быть по-разному. Надо, чтобы оно было корректно и понятно, дальше как-то само. Можешь посмотреть какие-нибудь библиотеки вроде boost::serialization

xoki87

возник вот еще какой вопрос,
запускаю цикл while(cin>>n){cout<<n;}, где п - типа int
но первое число, которое я ввожу не печатается, начинает печатать только со второго введенного числа, в чем проблема?

margadon

ну может буферизация срабатывает

xoki87

а как обойти этот момент?

SEMEN73

возник вот еще какой вопрос,
запускаю цикл while(cin>>n){cout<<n;}, где п - типа int
но первое число, которое я ввожу не печатается, начинает печатать только со второго введенного числа, в чем проблема?
Таки первое число вообще не печатается, или печатается, но не сразу?
Для начала стоит заменить {cout<<n;} на {cout<<n<<flush;} или {cout<<n<<endl;}.

xoki87

первое число не печатается вообще

Serab

я че-то тут посмотрел и понял, что в прошлый раз читал в каком-то неадекватосе и говорил про специализацию, а тут видимо имелось в виду инстанцирование, так?

elenangel

ну написано-то вроде именно про специализацию, а уж что имелось ввиду на самом деле - не известно.
Оставить комментарий
Имя или ник:
Комментарий: