代码的简化版:

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建议)
  • 使用sbi的模板解决方案,或
  • notMethod设为Foo的私有(private)静态成员函数(生成的代码与免费的非成员函数完全相同)。

  • 哪种解决方案最合适,实际上取决于notMethod的功能。

    如果notMethod使用Bar并且Bar仅在Foo的内部实现的上下文中才有意义,那么我将notMethod设为私有(private)的静态成员函数,因为它是Foo的内部函数的一部分。

    如果notMethod是需要将非Foo作为其第一个参数的运算符(意​​味着它不能成为Foo的成员),并且如果我想将Bar保持私有(private),则可以将该运算符作为 friend 。

    如果notMethod在迭代器上实现了通用操作,我将其设为模板函数。

    如果BarFoo的客户可能感兴趣的类,我将Bar和typedef公开,并使用我最初建议的解决方案。

    09-25 21:15