2014-03-03 67 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 >,其中标签类型是不完整的类型。但就是这些。