2012-10-14 20 views
0

one.h:好奇,空間和功能參數

namespace one { 
    class X : public IZ { 
     public: 
      void function(); // virtual function (=0) in IZ 
    } 
} 

two.h

namespace one { 
    class Y { 
     public: 
      void functionY(class X& x); // or one::X& x 
    } 
} 

我有幾個文件分發幾類,並共享同一個命名空間。從我所瞭解的情況來看,如果我對所有類都有相同的名稱空間,它們都可以互相訪問,而不需要放置NAMESPACE :: class_x,因爲它們都屬於同一個名稱空間。

我想知道的是爲什麼在上述特殊情況下需要在X& x之前使用關鍵字classnamespace::

它與X遺傳的IZ它作爲一個虛擬功能,然後「覆蓋」在X

+0

你有沒有在two.h中聲明'class X'? – Cornstalks

+0

@Cornstalks不起作用,我需要包含X類頭文件並使用類X關鍵字,否則我會得到「你需要在這個範圍內使用類標籤」。但這很奇怪,因爲其他班級不會給出這個錯誤。 – lm2s

回答

0

要解決這個問題:問題是由循環引用造成的。

1

在這種情況下,X類型在編譯時解析。鏈接器需要了解X是什麼,它是一個類,或者它在一個名稱空間中作用域。

  1. 如果將範圍擴大它在同一個命名空間namespace::x那麼你 如果類沒有在 命名空間中定義會得到一個編譯錯誤。
  2. 如果您將其定義爲一個類,並且該定義所屬的 名稱空間中存在相同的類,則該定義將解析爲 。
+0

但是我有另一個類,我們稱它爲W,它也用於Y類函數中,並且如果我不把類W或者一個W寫入,那麼這個類不會給我一個錯誤。它們都屬於相同的命名空間。它可能與one.h中包含two.h和two.h中的one.h有關嗎? – lm2s

+0

@ lm2s我不太明白你的意思。 –

+0

見下文,它是關於循環參考.. – lm2s

1

命名空間與否,您需要聲明您希望稍後參考的類。

您可以#include "one.h"在文件two.h做出的one::X整個定義知道,或者你可以添加一個聲明X沒有定義它:

// two.h 

namespace one 
{ 
    class X; 

    class Y 
    { 
     void f(X const & x); 
     // ... 
    }; 
} 

在這兩種情況下,你不要」 t需要重新命名空間,因爲你已經在裏面了。

+0

只是轉發類不起作用,我需要包含標題。它可能與交叉包含有關...... – lm2s

+0

@ lm2s:這取決於您是否需要完整的'X'類型。只有你可以知道這一點。我發佈的示例是正確的,但可能不代表您的實際代碼。 –

+0

實際的問題似乎是關於循環引用,並且由於X是一個單例類,我需要完全訪問和類轉發不起作用。感謝您的幫助! :) – lm2s