2011-08-05 58 views
3

該程序無法編譯(使用gcc-4.5)。該錯誤消息說:typedef'd類型不可見作爲成員函數的返回類型

錯誤:「myType_t」沒有指定類型

1 class abc{ 
    2 //typedef int myType_t; 
    3 
    4 public: 
    5 typedef int myType_t; 
    6 
    7  abc(); 
    8  myType_t fun1(); 
    9 }; 
10 
11 myType_t abc::fun1() 
12 { 
13 return 0; 
14 } 
15 
16 int main() 
17 { 
18 abc abc1; 
19 return 0; 
20 } 

現在宣佈typedef int myType_t;abc外使這個編譯。 我的困惑是,如果成員函數的返回類型是在類中定義的類型,那麼問題是什麼。

+3

下次您發佈一些代碼時,最好先刪除行號。你所擁有的代碼不是一個正確的測試用例。 –

+0

alrite,問題是'vi'編輯器的行號也被複制。我會在下一次處理這件事。 –

+0

@Aditya:正確的測試用例:我可以將其複製到我的編譯器中並進行編譯而不做任何更改的代碼。看看我複製這個時會發生什麼? http://www.ideone.com/I60DW – Bill

回答

8

從C++標準:

9.9嵌套類型名稱[class.nested.type]

類型名稱服從完全相同的範圍規則其他names.In特別是,在類定義中定義的類型名稱不能在沒有限定的類別之外使用。

class X { 
public : 
    typedef int I; 
    class Y {/. . ./}; 
    I a; 
}; 

I b;   // error 
Y c;   // error 
X::Y d;   // OK 
X::I e;   // OK 

所以你需要訪問它:

abc::myType_t abc::fun1() 
5
myType_t abc::fun1() 

由於myType_t是嵌套類型,所以你寫這篇文章:

abc::myType_t abc::fun1() 
//^^^^^^^^^^^^^note this! 

abc::告訴myType_t是類abc內部定義的編譯器。你寫abc::myType_t就像你寫abc::fun1()一樣。但是在課堂上,你不需要寫abc::myType_t也不需要寫fun1()

3

這是因爲在C++語法怪癖。

因爲成員函數的類只在聲明瞭函數本身的名稱的時刻才被精確定義,所以之前的任何東西都必須完整地拼出它。

ReturnType 
ClassName 
::    // only here do we enter the scope 'ClassName' 
FunctionName 
(
    ArgumentType0, 
    ArgumentType1, 
    ... 
) { 
} 

這可以使用的C++ 0x遲返回類型語法

auto 
ClassName 
:: 
FunctionName 
(
    ArgumentType0, 
    ArgumentType1, 
    ... 
) 
-> 
ReturnType 
{ 
} 

因爲它推遲返回類型足夠長的時間,進入範圍的聲明中克服了(它也允許它基於申報關於函數的參數,例如使用decltype)。