ДЕКЛАРАЦИЯ: Этот вопрос ВСЕ об ошибке В НАЛИЧИИ следующего, продемонстрированного с помощью оператора. Я понимаю, что есть и другие подобные вопросы по 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 является избавление от полностью определенного имени при реализации функции-члена (в этом случае перегрузка оператора). Поэтому, пожалуйста, воздержитесь от этого.
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
Вы можете использовать полное квалифицированное имя для вашего определения (и удалить using
):
MyClass::MyIterator& MyClass::MyIterator::operator++(int)
{
// ...
}
Я нахожу это более ясным, так как, когда читатель видит это, он знает, что MyIterator
это вложенный тип MyClass
, не нужно читать и просматривать объявления об использовании.
Замечания:
operator++
является const, но ваша декларация не является: это ошибка.