C++ 嵌套迭代器类不命名类型

C++ 嵌套迭代器类不命名类型,c++,namespaces,nested-class,using-statement,C++,Namespaces,Nested Class,Using Statement,声明:这个问题是关于存在以下语句时的错误。我知道还有其他类似的问题,但都没有回答我的具体问题。我知道如何在不使用using语句的情况下使其工作。 在我的头文件中: class MyClass { public: class MyIterator { public: MyIterator& operator++(int); private: static const MyIterato

声明:这个问题是关于存在以下语句时的错误。我知道还有其他类似的问题,但都没有回答我的具体问题。我知道如何在不使用using语句的情况下使其工作。

在我的头文件中:

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

        private:
            static const MyIterator END; 
    };

    ...
};
在我的实现文件(.cc文件)中:

正如我在评论中提出的问题:我已经使用了这个类,为什么嵌套的“MyIterator”类没有被识别更正:我已经告诉编译器“使用类”,为什么

非常感谢

编辑: 非常感谢你指出这一点;复制粘贴时出错;已经纠正了


请注意,引入using语句的目的是在实现成员函数时去掉完全限定名(本例中为运算符重载)。因此,请不要建议。

使用::MyClass
在这里没有效果。命名空间/块范围中的using声明将另一命名空间中的成员引入当前命名空间,从而避免使用命名空间限定符。但在您的情况下,两个名称空间是相同的:全局名称空间

此类声明的经典用法是:

#include <iostream>
#include <string>
using std::string;
int main()
{
    string str = "Example";
    using std::cout;
    cout << str;
}
或者在C++11中,可以使用命名空间别名:

using MyIterator = MyClass::MyIterator


您可以在定义中使用完整的限定名称(并使用删除
):

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

注意:

  • 您对
    运算符+++
    的定义是const,但您的声明不是:这是一个错误

感谢您指出常量错误。已经纠正了。using语句的目的是让我在定义操作符(和其他函数)时能够省略长的完全限定名——如果没有帮助,那么:1)为什么没有?编译器应该将MyClass的公共函数/嵌套类添加到路径中进行解释。2) 我怎样才能达到目标(省略长长的全名)是的,我在cc文件中保留了using语句;我一直在抱怨。在我看来,这应该行得通,但显然不行。我很困惑。是的,它会起作用;事实上,在发布这个问题之前,我遇到了别名(另一种方法是使用typedef)。这并不是这个问题的真正含义;更重要的是为什么我的方式不起作用。。。对不起,我是个控制狂,我很想按我的方式去做;)@h9u如果
不能使用声明,请参见我的编辑。
typedef MyClass::MyIterator MyIterator;
using MyIterator = MyClass::MyIterator
MyClass::MyIterator& MyClass::MyIterator::operator++(int)
{
    // ...
}