Вложенный класс Iterator не называет тип

ДЕКЛАРАЦИЯ: Этот вопрос ВСЕ об ошибке В НАЛИЧИИ следующего, продемонстрированного с помощью оператора. Я понимаю, что есть и другие подобные вопросы по SO, но никто из них не ответил на мой конкретный вопрос. И я знаю, как заставить это работать БЕЗ заявления об использовании.

В моем заголовочном файле:

class MyClass
{
public:
class MyIterator
{
public:
MyIterator& operator++(int);

private:
static const MyIterator END;
};

...
};

В моем файле реализации (файл .cc):

using ::MyClass; //**QUESTION: I've already used the class, why did the nested MyIterator class not get recognized?** EDIT: excuse my English, I can't write - by I've already used, I mean, I've already told the compiler "using that class"
// the following line is the definition of the static const object
const MyIterator MyIterator::END = MyIterator(); //error: ‘MyIterator’ does not name a type

MyIterator& MyIterator::operator++(int) //error: ‘MyIterator’ does not name a type
{
...
}

Как я добавил в комментарии: ВОПРОС: Я уже использовал класс, почему вложенный класс MyIterator не был распознан? — исправление: я уже сказал компилятору «используя класс», почему …

Большое спасибо.

РЕДАКТИРОВАТЬ:
Большое спасибо за указание на const дискретность; это была ошибка при копировании; это было исправлено.

Обратите внимание, что целью введения оператора using является избавление от полностью определенного имени при реализации функции-члена (в этом случае перегрузка оператора). Поэтому, пожалуйста, воздержитесь от этого.

2

Решение

using ::MyClass не имеет никакого эффекта здесь. Объявление использования в пространстве имен / блоков вводит член из другого пространства имен в текущее, избегая спецификатора пространства имен. Но в вашем случае оба пространства имен одинаковы: глобальное

Классическое использование такой декларации:

#include <iostream>
#include <string>
using std::string;
int main()
{
string str = "Example";
using std::cout;
cout << str;
}

В вашей ситуации вы можете использовать typedef:

typedef MyClass::MyIterator MyIterator;

Или в C ++ 11 вы можете использовать псевдоним пространства имен:

using MyIterator = MyClass::MyIterator

Live Demo


Вы можете использовать полное квалифицированное имя для вашего определения (и удалить using):

MyClass::MyIterator& MyClass::MyIterator::operator++(int)
{
// ...
}

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

Замечания:

  • Ваше определение operator++ является const, но ваша декларация не является: это ошибка.
1

Другие решения


По вопросам рекламы [email protected]