未知的返回类型错误(C ++)

时间:2014-04-05 16:10:52

标签: c++

我的问题是我需要首先定义我的接口,然后在代码中进一步实现它,但我的问题是,当我实现方法时,应该返回类内部已知类型的函数似乎在类外部是未知的。

这是我的代码:

class Test {
    class Inner {
    };    
public:    
    Inner* foo (void);
};

Inner* Test::foo(){
}

此代码产生错误,因为类外部的函数Inner是未知的。任何人都可以帮助我如何创建只返回类中定义的类型的简单函数吗?

感谢您的帮助。

5 个答案:

答案 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(){
}