частичная специализация шаблона функции

Привет, я думаю, что мне что-то не хватает в этой технике. Пытался следовать примерам, но следующее дает мне ошибку: invalid use of incomplete type ‘class Citizen<T, minAge, maxAge, true>’

template <typename T, T minAge, T maxAge, bool isarmed>
class Citizen {
public:

    Citizen(T health, T age);
    Citizen(T health, T age, T attackPower);
    T getAttackPower();

private:
    T _health;
    T _age;
    T _attackPower;
};

template <typename T, T minAge, T maxAge>
T Citizen<T, minAge, maxAge, true>::getAttackPower() {
    return _attackPower;
}

person Community    schedule 30.11.2016    source источник


Ответы (1)


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

person Eugene    schedule 30.11.2016
comment
Тогда как это сделать, не меняя интерфейс класса? - person ; 30.11.2016
comment
как я могу это сделать, используя выражение enable_if_t? - person ; 30.11.2016
comment
@tomtom Какова ваша реализация в случае isarmed==false? Вероятно, вы могли бы объединить оба и вообще не использовать частичную специализацию. - person Eugene; 30.11.2016
comment
Я не хочу, чтобы компилятор компилировал эту функцию в случае isarmed == false - person ; 30.11.2016
comment
Затем используйте свою реализацию в неспециализированном шаблоне и вставьте в нее static_assert(isarmed,"Citizen must be armed!");. - person Eugene; 30.11.2016
comment
если я вставлю эту строку: template‹bool canAttack = isarmed, typename = std::enable_if_t‹!canAttack›› это работает, но только если эта функция определена в определении класса - person ; 30.11.2016
comment
Использование enable_if или других SFINAE имеет смысл только в том случае, если у вас есть другие перегрузки функции в том же классе. В противном случае static_assert и легче читать, и дает лучшее сообщение об ошибке. - person Eugene; 30.11.2016
comment
Ok. Действительно, мне нужно 2 разных ctor, зависящих от погоды isarmed == true или isarmed == false - person ; 30.11.2016
comment
Давайте продолжим обсуждение в чате. - person ; 30.11.2016