Есть ли другой обходной путь для наследования базового класса шаблона? - PullRequest
1 голос
/ 11 февраля 2011

Этот код вызывает ошибку в компиляторе GNU:

class A
{
public:
    int X;
};

template<class T>
class Foo : public T
{
public:
    void doStuff();
};

template<class T>
void Foo<T>::doStuff()
{
    X++;
}

Уже есть ответ , почему это ошибка.Я хотел бы знать, есть ли другой способ обойти эту ошибку, вместо использования

T::X

каждый раз, когда я хочу сослаться на член X.Я пробовал это:

template<class T>
void Foo<T>::doStuff()
{
    using T::X;
    X++;
}

Но GCC выдает ошибку: "квалифицированное имя класса не допускается"

Ответы [ 4 ]

8 голосов
/ 11 февраля 2011

using T::X должно работать.Если он выдает ошибку, существует какая-то другая проблема с вашим кодом, или это должна быть ошибка компилятора.Смотрите сами: http://www.ideone.com/MI9fM


  • Вы можете использовать указатель this, например

    template<class T>
    void Foo<T>::doStuff()
    {
        this->X++;
    }
    

    Это дает компилятору подсказку, где искать символX.

Демоверсия: http://www.ideone.com/NIucO


  • Вы также можете сделать это:

    template<class T>
    void Foo<T>::doStuff()
    {
         T::X++;
    }
    

Демо: http://www.ideone.com/PswvG

3 голосов
/ 11 февраля 2011

Это также будет работать:

this->X++;

Это скажет компилятору, что, поскольку он видит, что X не является членом производного класса, он должен исходить из базы шаблонов, и нет необходимостибеспокоиться об этом.

1 голос
/ 11 февраля 2011
class A
{
public:
    int X;
};

template<class T>
class Foo : public T
{
public:
    using T::X;
    void doStuff();
};

template<class T>
void Foo<T>::doStuff()
{
    X++;
}

int main()
{
    Foo<A> o;
    o.doStuff();
}
0 голосов
/ 12 февраля 2011

Может это сработает?Просто угадайте:

int &X = T::X;

Это создаст псевдоним, который можно использовать в блоке кода, аналогично using T::X, который вы пробовали, который не работал.

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