2014-03-03 69 views
0

我對模板的使用經驗並不豐富,而且我在我的團隊代碼中發現了一些讓我感到困惑的用法。這些shared_ptr實例之間的區別?

比方說,我有以下兩種類型定義爲shared_ptr的一個基類:

class Foo 
{ 
    virtual ~Foo(); 
    virtual void bar() = 0; 
}; 

typedef boost::shared_ptr<Foo> FooPtr1;   //this is what i'm used to seeing 
typedef boost::shared_ptr<class Foo> FooPtr2; //this is in our codebase 

有這些類型定義的有什麼區別?它與派生類的使用有關嗎?

+0

我相信這個實例是相同的。 – lisyarus

+0

也許還有另外一個'Foo'不是'class'(一個'struct'或'union',或者甚至一個'const some_type Foo = ...')代碼試圖消除歧義...... – twalberg

+0

@ twalberg:由於['class'和'struct'可互換](http://coliru.stacked-crooked.com/a/8782dfe1587948f2)在這種情況下,這甚至沒有幫助。如果你不顧一切地立即出錯[如果'Foo'是'union'](http://coliru.stacked-crooked.com/a/d723de0b4e9bc4e8)或值,但是,是的。 –

回答

5

沒有區別。

支持語法class Foostruct Foo保持一致,後者又支持C兼容性。在C a struct中不是一種類型:對應於名爲S的結構的類型struct S,其通常通過typedef命名。在C++中,typedef不是必需的,語法在很大程度上是不相關的。我發現它適用於爲模板實例化引入「內聯」標籤類型,如X< whatever, struct X_tag >,其中標籤類型是不完整的類型。但就是這些。