我的问题是我需要首先定义我的接口,然后在代码中进一步实现它,但我的问题是,当我实现方法时,应该返回类内部已知类型的函数似乎在类外部是未知的。
这是我的代码:
class Test {
class Inner {
};
public:
Inner* foo (void);
};
Inner* Test::foo(){
}
此代码产生错误,因为类外部的函数Inner是未知的。任何人都可以帮助我如何创建只返回类中定义的类型的简单函数吗?
感谢您的帮助。
答案 0 :(得分:6)
你需要
Test::Inner* Test::foo(){
}
如果成员函数定义在类定义之外,那么返回类型在类范围中 不 ,与函数的其余部分不同,因此您需要明确限定返回类型。
答案 1 :(得分:5)
由于没有人提到它,你也可以在C ++ 11中执行此操作:
auto Test::foo() -> Inner * {...}
如果完全限定名称很长,这可能很有用。在C ++ 14中,您可以不使用尾随类型部分,只需执行以下操作:
auto Test::foo() {...}
这将推断出返回类型。
答案 2 :(得分:3)
Inner是嵌套类,在类Test
之外,它必须是完全限定的:
Test::Inner* Test::foo() {
//...
}
因为在全局范围内Inner
确实未知,只有Test::Inner
,因此Inner
内的Test
已知。您还可以在全局范围内拥有另一个Inner
,与Test
相同,这将是其他Inner
,而不是Test::Inner
。
答案 3 :(得分:3)
您似乎没有指定范围,因此它当然仍然未知。 C ++编译器将在Inner
类之外查找Test
类,该类也可以作为不同的类出现,但不是特定情况。
这就是为什么你还需要提供范围,即使是返回类型。这并不是说您需要在测试类中使用范围,但在外部,您将不得不使用它。
因此,正确的代码将是这样的:
class Test {
class Inner {
};
public:
Inner* foo (void);
};
Test::Inner* Test::foo(){
//^^^^
}
严格来说,如果你有一个最近的编译器,你甚至可以使用auto,但它会变得不那么全面。
答案 4 :(得分:2)
class Test {
class Inner {
};
public:
Inner* foo (void);
};
Test::Inner* Test::foo(){
}