Любопытно повторяющийся шаблон шаблона со статическими и постоянными закрытыми элементами

#c #templates

#c #шаблоны

Вопрос:

У меня есть следующий класс шаблона:

 template<typename T> class virtualCard
{
private:
    static int numCards;
    const int maxCards;
public:
    virtualCard(int);  //I want to manage all card construction from here
    virtual ~virtualCard();
    virtual void activate() = 0;
};
template<typename T> int virtualCard<T>::numCards = 0;
template<typename T> virtualCard<T>::virtualCard(int max) : maxCards(max) 
{
    if (numCards < maxCards)
          numCards;
    else
        throw std::logic_error("All these cards are on other people's hand, you can not draw any.");
}
  

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

Затем у меня есть этот card класс, который является абстрактным классом, который ведет подсчет только общего количества карт в игре.

 class card : public virtualCard<card>
{
public:
    card();
    virtual ~card();
    virtual void activate() = 0;
};
card::card() : virtualCard(13) {} //there is a maximum of 13 cards in-game at any given time
card::~card() {} //don't do anything, it is all managed from the template class
  

Но тогда у меня возникает проблема, когда я хочу создать заданную карточку, например:

 class moveAnywhere : public card, public virtualCard<moveAnywhere>
{
public:
    moveAnywhere();
    virtual ~moveAnywhere();

    virtual void activate();
};
  

Как я должен вызвать конструктор этой карты?

Я пытался moveAnywhere::moveAnywhere() : card(), virtualCard(3) {}

Мое намерение состояло в том, чтобы создание moveAnywhere карточки создало бы card (поэтому card счетчик автоматически увеличивается на единицу. И, кроме того, у меня был бы свой собственный moveAnywhere статический счетчик, вызвав virtualCard<moveAnywhere> с 3 в качестве аргумента (поскольку максимальное количество этих карточек равно 3, для card которых используется 13).).

Проблема в том, что я получаю «Неоднозначный доступ к virtualCard «, я попытался явно изменить конструкторы:

 card::card() : virtualCard<card>(13) {}
moveAnywhere::moveAnywhere() : card(), virtualCard<moveAnywhere>(3) {}
  

Но я все еще получаю ошибку.

Комментарии:

1. Почему вы наследуете от card и virtualCard ? Похоже, вам просто нужно наследовать от car .

2. @NathanOliver Потому что я хочу дополнительно иметь статическую переменную, которая подсчитывает, сколько moveAnywhere карточек у меня есть. Вот почему я наследую шаблон с moveAnywhere . Если бы я наследовал только от card, тогда я бы посчитал только, сколько card у меня есть.