简化版代码:
foo.h中:
class Foo {
private:
class Bar {
// ...
};
typedef std::map<int, Bar> mapType;
mapType _map;
public:
void method(mapType::iterator it);
};
Run Code Online (Sandbox Code Playgroud)
Foo.cpp中:
void Foo::method(mapType::iterator it) {
// ...
notMethod(it);
}
void notMethod(mapType::iterator it) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
不出所料,我'mapType' is not a class or namespace name在VS2008 notMethod的定义中得到了错误.是否有任何(优雅的)方式可以避免std::map<int, Bar>在notMethod不改变notMethod方法的情况下输入每个定义中的每一个?
Mar*_*n B 20
使用
void notMethod(Foo::mapType::iterator it) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
并将typedef放在Foo类声明的公共部分.
编辑:
如果你想避免这种情况,你可以
notMethod朋友(丹丹建议),notMethod一个私有静态成员函数Foo(生成完全相同的代码,就好像它是一个免费的非成员函数).哪种解决方案最合适取决于具体做什么notMethod.
如果在内部实现的上下文中notMethod使用Bar并且Bar真正有意义Foo,我将创建notMethod一个私有静态成员函数,因为它Foo是内部的一部分.
如果notMethod是一个需要将非Foo作为其第一个参数的运算符(意味着它不能成为其成员Foo),并且如果我想保持Bar私有,我会使运算符成为朋友.
如果notMethod在迭代器上实现泛型操作,我会使它成为模板函数.
如果Bar是一个可能对Foo客户感兴趣的类,我会将Bartypedef公开并使用我最初建议的解决方案.