2015-01-03 3 views
1

ЗАЯВЛЕНИЕ: Этот вопрос ВСЕ о ошибке В ПРИСУТСТВИИ следующего продемонстрированного использования оператора. Я понимаю, что есть и другие подобные вопросы, но никто из них не ответил на мой конкретный вопрос. И я знаю, как заставить его работать без инструкции using.Вложенный класс итератора не называет тип

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

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 
{ 
    ... 
} 

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

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

EDIT: Большое спасибо за указание несоответствия const; это была ошибка во время копирования пасты; он был исправлен.

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

ответ

1

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

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

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

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

typedef MyClass::MyIterator MyIterator; 

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

using MyIterator = MyClass::MyIterator 

Live Demo


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

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

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

Примечание:

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

спасибо за указание ошибки const. Это исправлено. Намерение оператора using заключается в том, чтобы позволить мне опустить длинное полностью квалифицированное имя, когда я определяю оператор (и другие функции) - если это не помогает, то: 1) почему бы и нет?компилятор должен добавить публичную функцию/вложенные классы MyClass в путь для интерпретации. 2) как я могу заполнить цель (опустить длинное полное имя) – h9uest

+0

да, я сохранил инструкцию using в моем файле cc; компилятор жаловался. Это должно работать, на мой взгляд, но, видимо, нет. Я смущен. – h9uest

+0

да, это сработает; Фактически, я столкнулся с псевдонимом (другим способом было использование typedef), прежде чем публиковать этот вопрос. На самом деле это не вопрос. это больше о том, почему не мой способ не сработал ... извините, что я управляющий уродом, хотел бы, чтобы он был моим путем;) – h9uest

Смежные вопросы