Любопытно повторяющийся шаблон шаблона со статическими и постоянными частными членами - PullRequest
0 голосов
/ 22 марта 2019

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

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) {}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...