C++ 嵌套迭代器类不命名类型
声明:这个问题是关于存在以下语句时的错误。我知道还有其他类似的问题,但都没有回答我的具体问题。我知道如何在不使用using语句的情况下使其工作。 在我的头文件中: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
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)
{
// ...
}