2013-03-20 79 views
2
typedef int abc; 

class Some{ 
    public: 
     abc foo(){...} 
     typedef double abc; 
}; 

在上面的代碼中的參數列表裏,我明白了,我得到一個錯誤:因爲在這本書名稱查找成員函數

error: changes meaning of 'abc' from 'typedef int abc' 

C++底漆,第五edtion,它說:

Class definitions are processed in two phases:

1.First, the member declarations are compiled.

2.Function bodies are compiled only after the entire class has been seen.

但在這裏的代碼:

typedef int abc; 

class Some{ 
    public: 
     int foo(abc){...} 
     typedef double abc; 
}; 

我在參數列表中設置了abc。 但我沒有得到那種錯誤,編譯器工作得很好。 爲什麼後面的代碼不會給我帶來類似於前者的任何錯誤?

+0

您的問題是? – Oswald 2013-03-20 13:56:10

+0

我的不好。我編輯它。 – longtengaa 2013-03-20 14:04:14

回答

1

我不認爲有任何理由。這個錯誤不需要診斷(根據標準C++),所以當你的代碼中有這個錯誤時,行爲是不確定的。

你的編譯器還沒有檢查過這個錯誤的參數列表,但可能已經完成了。

0

你需要限定它,Some::abc

typedef int abc; 

class Some{ 
    public: 
     Some::abc foo(){...} 
     typedef double abc; 
}; 
+0

是的,我知道。但我在這裏問的是爲什麼後面的代碼不會像前者那樣提示錯誤。 – longtengaa 2013-03-20 13:54:48

+0

如果你想知道爲什麼後面的代碼不會像前者那樣提示錯誤,你應該在問題中這樣說,而不是在答案的評論中。 – Oswald 2013-03-20 13:58:59

+0

對不起,我只是忘記了..... – longtengaa 2013-03-20 14:03:10

0

與第一例子給出了一個錯誤是,名稱查找不考慮返回類型的原因。但是當調用實際函數體時,編譯器將使用Some::abc並找到差異。

typedef int abc; 

class Some{ 
    public: 
     abc foo() { return abc(); } // during lookup/resolution, "abc" is known to be int, return type is not considered 
     typedef double abc; 
}; 

int main() 
{ 
    Some s; 
    int x = s.foo(); // kaboom, return type is double. 
} 

在第二個例子中,重新定義類型是不重要,因爲名字查找期間,abc已知是一個int,因爲內的typedef的定義尚未見到。在調用站點的函數實例中沒有任何後果,因爲返回類型也是int。沒有任何不匹配。

typedef int abc; 

class Some{ 
    public: 
     int foo(abc) { return int(); } // during lookup/resolution, "abc" is known to be int 
     typedef double abc;    // this will not have been seen yet in the previous line 
}; 

int main() 
{ 
    Some s; 
    int x = 0; 
    s.foo(x); // OK, x is of type int 
} 
+0

但是在整個班級被看到之後,不應該編譯函數體嗎? – longtengaa 2013-05-29 15:03:10

0

在MinGW中,如果成員函數的返回類型顯示爲由typedef聲明定義的別名類型。不允許改變其含義。 您要求的名稱查找規則仍然像通常在Lippman的C++入門中所介紹的那樣有效 - 第447頁 - 類名成員聲明的名稱查找。

  1. 考慮在使用名稱之前出現的類成員的聲明。
  2. 如果步驟1中的查找不成功,則會考慮出現在定義該類的範圍內並出現在類定義本身之前的聲明。