gcc возвращает ошибку с вложенным классом - PullRequest
2 голосов
/ 28 марта 2010

Я пытаюсь использовать полное имя моего вложенного класса, как показано ниже, но компилятор не работает!

template <class T> class Apple {
    //constructors, members, whatevers, etc...
public:
    class Banana {
    public:
        Banana() {
            //etc...
        }
        //other constructors, members, etc...
    };
};

template <class K> class Carrot{
public:
    //etc...
    void problemFunction()
    {
        Apple<int>::Banana freshBanana = someVar.returnsABanana(); //line 85
        giveMonkey(freshBanana);  //line 86
    }
};

Моя проблема в том, что компилятор говорит:

Carrot.h:85: error: expected ';' before 'freshBanana'
Carrot.h:86: error: 'freshBanana' was not declared in this scope

Я думал, что использование полного имени позволило мне получить доступ к этому вложенному классу? Это, вероятно, ударит меня по лицу, но что я не вижу здесь ??

1 Ответ

6 голосов
/ 28 марта 2010

Это, вероятно, не то, что вы делаете в своем коде. Сообщение об ошибке выглядит так, как будто вы делаете это

Apple<K>::Banana freshBanana = someVar.returnsABanana();

Компилятор должен знать перед синтаксическим анализом кода, называет ли имя тип или нет. В этом случае, когда он анализирует, он не может знать, потому что тип K еще не известен (у вас может быть специализация для Apple<int>, у которой нет этого вложенного класса). Таким образом, предполагается, что Apple<K>::Banana не является типом. Но тогда это выражение и после него нужен оператор или точка с запятой.

Вы можете исправить это, вставив typename:

typename Apple<K>::Banana freshBanana = someVar.returnsABanana();

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

...