2008-12-24 75 views
17

有沒有人知道爲什麼類名的typedef不能像朋友聲明的類名一樣工作?爲什麼我無法通過typedef聲明朋友?

class A 
{ 
public: 
}; 

class B : public A 
{ 
public: 
    typedef A SUPERCLASS; 
}; 

typedef A X; 

class C 
{ 
public: 
    friend class A;    // OK 
    friend class X;    // fails 
    friend class B::SUPERCLASS; // fails 
}; 

回答

9

目前還不行。我還不知道原因(只是查找它,因爲我覺得它很有趣)。更新:你可以在第一個建議中找到支持typedef-name爲朋友的原因:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf。原因是該標準僅支持詳細類型說明符。很容易只允許那些聲明,並說如果聲明爲朋友的實體尚未聲明,它將成爲周圍名稱空間的成員。但是,這意味着,如果你想使用一個模板參數,你必須做的(需要的類,那麼例如)

friend class T; 

但是,這帶來了另外的問題,並且它想通不值得增益。現在,本文提出允許提供其他類型說明符(以便允許使用模板參數和typedef名稱)。

下一個C++版本(由於2010年)將能夠做到這一點。

查看本標準更新建議:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf。它不會僅允許typedef名稱,而且還將使用作爲聲明爲朋友的類型的模板參數。

0

AFAIK,在C++中typedef在與類結合使用時不會創建完整的同義詞。換句話說,它不像一個宏。

其中的限制是,同義詞不能出現在類或結構體前綴之後,或者被用作析構函數或構造函數名稱。你也不能繼承同義詞。我敢打賭,這也意味着你不能朋友。

1

我在VC++ 8.0試過代碼:

... 
class C 
{ 
public: 
    friend class A;  
    friend X;    
    friend B::SUPERCLASS; 
}; 
... 

這是一個沒有出現任何錯誤。

我不知道是否MS特定。

0

typedef定義了一個類型。朋友拒絕宣佈朋友的類別或功能(基本上是範圍),然後有「訪問」申報類的非公共區域...

原始人,i.E.一個float或一個int *不用代碼等來定義範圍, 他們不會「使用」這個類。不要忘記,你也可以在typedef中「打包」調用約定,對齊attrib和其他編譯器特定的東西,即由同一類實現的多個向量TYPES,但具有不同的對齊屬性。 =>類型不是類,反之亦然。恕我直言,聲明一個朋友typedef可能很有用,但是當來自任何地方的「class typedefs」可以設置爲朋友時,友誼會變得極其難以理解,因此容易出錯,尤其是在模板過度使用的情況下。

由於廣泛的依賴關係,使單個typedef無效可能導致整個項目陷入混亂。 模板朋友和0x模板typedefs是有用的,但不要放鬆朋友聲明的規則。

我不知道任何有關朋友typedefs的建議。

0
class MyClass 
{ 
    friend class ClassFromTypedef; 

    // ... 
}; 

template<class T> 
struct get_type{ typedef T type;}; 

class MyClass 
{ 
    friend class get_type<ClassFromTypedef>::type; 

    // ... 
}; 

似乎對我與--std =的C++ 0x的選擇上下工夫GCC-4.6.0不工作(我不知道這是否是重大)。 不起作用...(對不起,我是幻覺)

+2

既然你的答案沒有提供任何有用的信息,你有沒有考慮刪除它? – 2016-03-11 09:24:31