从嵌套类对父类进行类型推导

时间:2011-09-03 11:28:03

标签: c++ c++11

我在Visual Studio 2010中遇到了类型扣除的问题。我需要做类似的事情:

class Outer {
    template<typename T> ... SomeTemplateFunction() { ... }
    class NestedClass {
        std::vector<decltype(SomeTemplateFunction<SomeOtherType>())> stuff;
    };
};

然而,即使在调整了方法的非静态性之后

class Outer {
    static Outer* null() { return nullptr; }
    template<typename T> ... SomeTemplateFunction() { ... }
    class NestedClass {
        std::vector<decltype(Outer::null()->SomeTemplateFunction<SomeOtherType>())> stuff;
    };
};

Visual Studio哭了,说外部类是一个不完整的类型。如何修改上面的代码片段以推断出外部类的模板函数的返回类型?

1 个答案:

答案 0 :(得分:1)

您可以稍后定义嵌套类

class Outer {
    static Outer* null() { return nullptr; }
    template<typename T> ... SomeTemplateFunction() { ... }
    class NestedClass;
};

class Outer::NestedClass {
    std::vector<decltype(Outer::null()->SomeTemplateFunction<SomeOtherType>())> stuff;
};

编译器对你抱怨是对的。对于类成员访问(.->),与::不同,该类必须完整。因此,如果它是一个静态函数,它会没问题,但由于它是一个非静态成员函数,它会出错。

该规则的一个例外是当使用this时,在非静态成员函数的指定返回类型中发生成员访问时(通常,在参数结束)之间) list和函数体开始之前,允许该规则的例外。在内部类的成员函数体中,外部类被认为是完整的,因此不再需要规则的例外)。