C ++ возвращает вложенный класс с шаблоном по проблеме базового класса - PullRequest
9 голосов
/ 28 ноября 2009

Я пытаюсь создать объект списка с вложенным классом итератора, чтобы понять, как он работает. В каком-то методе я пытаюсь вернуть объект итератора, но он не работает. Я создал пример, чтобы показать проблему:

// CLASS A
template <class T>
class A
{
    public:
        class B;
        A(){}
};

// CLASS B
template <class T>
class A<T>::B
{
    private:
        int varB;

    public:
        B(B& b);
        B(const int&);
        B returnThis();
};

template <class T>
A<T>::B::B(const int& value)
{
    varB = value;
}

template <class T>
A<T>::B::B(B& b)
{
    varB = b.varB;
}

template <class T>
A<T>::B A<T>::B::returnThis()
{
    return *this;
}

// MAIN

void main()
{
    A<int>::B classB(10);
}

Ошибка рядом с этими строками:

template <class T>
A<T>::B A<T>::B::returnThis()

Компилятор говорит мне, что мне не хватает a; до A :: B :: returnThis ()

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

1 Ответ

14 голосов
/ 28 ноября 2009

Вам нужно typename:

typename A<T>::B

Чтобы указать компилятору, что A<T>::B является типом. Вот хорошее объяснение почему.

Что означает B, зависит от того, что является A<T>, это называется зависимостью. Каждый раз, когда вы извлекаете тип из класса или структуры и он зависит от шаблона, вам нужно использовать typename.

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