2014-04-05 165 views
5

我的問題是,我需要先定義我的接口,然後在代碼中進一步實現它,但我的問題,我應該返回類內部已知類型的函數似乎是外部未知類我實施方法。未知的返回類型錯誤(C++)

這是我的代碼:

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

Inner* Test::foo(){ 
} 

此代碼產生錯誤,因爲類型內是在類外的未知功能。任何人都可以幫助我如何使簡單的函數,將返回只在類內定義的類型?

謝謝你的幫助。

+3

Test :: Inner * Test :: foo() –

回答

3

內是嵌套課內外Test它必須是完全合格的:

Test::Inner* Test::foo() { 
    //... 
} 

因爲在全球範圍內Inner確實是未知的,只有Test::Inner,所以InnerTest是已知的。您也可以在全球範圍內有另一個Inner,與Test相同,這將是其他Inner而不是Test::Inner

6

你需要

Test::Inner* Test::foo(){ 

}

如果一個成員函數定義類定義之外,則返回類型爲在類範圍內,不像函數的其餘部分,所以你需要明確限定返回類型。

3

您似乎沒有指定範圍,所以它當然不知道。 C++編譯器會在您的Test類之外尋找一個Inner類,它也可以作爲一個不同的類呈現,但它不在您的特定情況下。

這就是爲什麼你還需要提供範圍,即使是返回類型。這並不是說你需要在測試類中使用範圍,但是在外面,你將不得不因此而使用範圍。

因此,正確的代碼會是這樣的:

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

Test::Inner* Test::foo(){ 
//^^^^ 
} 

嚴格地說,如果您有最新的編譯器,你甚至可以使用自動,但隨後開始有點不太全面。

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

Test::Inner* Test::foo(){ 
} 
5

因爲沒有人提到它,你也可以做到這一點在C++ 11:

auto Test::foo() -> Inner * {...} 

如果完全合格的名稱是長這可能是有用的。在C++ 14中,您可以省略尾部類型部分,只需執行以下操作:

auto Test::foo() {...} 

這將推斷返回類型。