嵌套的Iterator类没有命名类型

时间:2015-01-03 21:49:43

标签: c++ namespaces nested-class using-statement

声明:这个问题是关于以下使用声明所展示的错误的全部问题。我理解其他类似的问题,但没有一个回答我的具体问题。而且我知道如何在没有使用声明的情况下使其工作。

在我的标题文件中:

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语句的目的是在实现成员函数时删除完全限定名称(在本例中为operator overload)。所以请不要暗示。

1 个答案:

答案 0 :(得分:1)

using ::MyClass此处无效。名称空间/块作用域中的using声明将另一个名称空间中的成员引入当前名称空间,从而避免使用名称空间限定符。但在你的情况下,两个命名空间都是相同的:全局命名空间

这种声明的经典用法是:

#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)
{
    // ...
}

我发现它更清楚,因为当读者看到它时,它知道MyIteratorMyClass的嵌套类型,不需要阅读和浏览使用声明。

注意:

  • 您对operator++的定义是const,但您的声明不是:那是一个错误。