代码的简化版:
Foo.h:
class Foo {
private:
class Bar {
// ...
};
typedef std::map<int, Bar> mapType;
mapType _map;
public:
void method(mapType::iterator it);
};
Foo.cpp:
void Foo::method(mapType::iterator it) {
// ...
notMethod(it);
}
void notMethod(mapType::iterator it) {
// ...
}
毫不奇怪,我在VS2008中以
'mapType' is not a class or namespace name
的定义收到了错误notMethod
。有什么(优雅的)方法可以避免不必将std::map<int, Bar>
转换为方法而在notMethod
的定义中键入每个notMethod
? 最佳答案
使用
void notMethod(Foo::mapType::iterator it) {
// ...
}
并将typedef放在
Foo
的类声明的public部分中。编辑:
如果要避免这种情况,可以
notMethod
的 friend (由DanDan建议)notMethod
设为Foo
的私有(private)静态成员函数(生成的代码与免费的非成员函数完全相同)。 哪种解决方案最合适,实际上取决于
notMethod
的功能。如果
notMethod
使用Bar
并且Bar
仅在Foo
的内部实现的上下文中才有意义,那么我将notMethod
设为私有(private)的静态成员函数,因为它是Foo
的内部函数的一部分。如果
notMethod
是需要将非Foo
作为其第一个参数的运算符(意味着它不能成为Foo
的成员),并且如果我想将Bar
保持私有(private),则可以将该运算符作为 friend 。如果
notMethod
在迭代器上实现了通用操作,我将其设为模板函数。如果
Bar
是Foo
的客户可能感兴趣的类,我将Bar
和typedef公开,并使用我最初建议的解决方案。