我在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哭了,说外部类是一个不完整的类型。如何修改上面的代码片段以推断出外部类的模板函数的返回类型?
答案 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和函数体开始之前,允许该规则的例外。在内部类的成员函数体中,外部类被认为是完整的,因此不再需要规则的例外)。