有没有办法输入这个?

sus*_*att 1 c++ typedef

简化版代码:

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类声明的公共部分.

编辑:

如果你想避免这种情况,你可以

  1. 结交notMethod朋友(丹丹建议),
  2. 使用sbi的模板解决方案,或
  3. 创建notMethod一个私有静态成员函数Foo(生成完全相同的代码,就好像它是一个免费的非成员函数).

哪种解决方案最合适取决于具体做什么notMethod.

如果在内部实现的上下文中notMethod使用Bar并且Bar真正有意义Foo,我将创建notMethod一个私有静态成员函数,因为它Foo是内部的一部分.

如果notMethod是一个需要将非Foo作为其第一个参数的运算符(意味着它不能成为其成员Foo),并且如果我想保持Bar私有,我会使运算符成为朋友.

如果notMethod在迭代器上实现泛型操作,我会使它成为模板函数.

如果Bar是一个可能对Foo客户感兴趣的类,我会将Bartypedef公开并使用我最初建议的解决方案.