идентичность выражений

198
23 марта 2018, 12:47
template < class Tp, class C = std::list<Tp>, size_t Tag = 5 >
class accountant {};
class  D1 : accountant<double> {};
class  D2 : accountant<double, void, void> {};

Хотелось бы узнать как будут отличаться производные классы, если эти два выражения не идентичны? Или все таки они идентичны?..

По причине того, что я неправильно задал интересующий мне вопрос, добавлю ниже

класс D2 не компилируется, а вот это:

class It : public std::iterator<std::random_access_iterator_tag, int, void, void, void>{};

компилируется. И вот это тоже:

class It : public std::iterator<std::random_access_iterator_tag, int> {};

В чем причина? И в чем разница между первым определением класса It и вторым?

Answer 1

Хотелось бы понять, как вы собираетесь скомпилировать

class  D2 : accountant<double, void, void> {};

подставляя void вместо значения? :)

Но в любом случае они будут различны. Как будут различны классы

class D1: public Base {};
class D2: public Base {};

А вот, скажем,

accountant<double>

и

accountant<double,std::list<double>,5>

эти будут идентичными.

Update

Вот как iterator определен в VC++2017:

template<class _Category,
    class _Ty,
    class _Diff = ptrdiff_t,
    class _Pointer = _Ty *,
    class _Reference = _Ty&>
    struct _CXX17_DEPRECATE_ITERATOR_BASE_CLASS iterator
    {   // base type for iterator classes
    using iterator_category = _Category;
    using value_type = _Ty;
    using difference_type = _Diff;
    using pointer = _Pointer;
    using reference = _Reference;
    };

Видно, что три последние параметра шаблона - просто типы, со значениями по умолчанию. void - тоже просто тип... так что его можно использовать в качестве аргументов шаблона. Если не использовать ничего - то этими типами в вашем варианте (для int) будут ptrdiff_t, int* и int&.

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

READ ALSO
Ошибка автоматического запуска chromedriver&#39;а

Ошибка автоматического запуска chromedriver'а

Несколько дней назад по необъяснимым мне пока причинам фоновая работа selenium'а (через Xvfb) стала сопровождаться автоматическим запуском экземпляра...

177
Узнать место на Sd-card или Внутренеей памяти Android

Узнать место на Sd-card или Внутренеей памяти Android

Узнать место на Sd-card или Внутренеей памяти Android какие методы?

190
Проверка входа на сайт

Проверка входа на сайт

ЗдравствуйтеНиже представлен код

151
Spring : Failed to load ApplicationContext в JUnit

Spring : Failed to load ApplicationContext в JUnit

Возникает вышепреведенная ошибка

220