2016-08-22 63 views
4

例如,利用此代码段:如何转发声明我将使用typedef创建的类型?

class Foo; 
class Something { 
    Foo *thing; 
}; 
typedef std::vector<Something> Foo; 

这并不编译,因为Foo已经是一个类型,当typedef被击中。不过,我认为这说明了我的用例;我有周期性的依赖关系,需要一个来完成其他的,但(目前)其中的一件事是typedef'd。我宁愿不写类似

class Foo { 
    std::vector<Something> inside; 
} 

,因为那时我需要记住insidemy_foo.inside.some_method()。我还想避免在std::vector<Something>周围写一个包装,因为它会有很多样板。

我该如何转发声明我正在用typedef定义的类型?另外,如何使用上述解决方案之一解决我的周期性依赖问题而不使用?它有可能吗?

请注意,我不是问“我怎样才能typedef与尚未申报的类型”。我在问“如何使用typedef来定义先前声明的类型”。

+0

道歉,如果任何术语关闭。我从来没有真正学过它。请随时纠正我的疑问或者质疑假设。 –

+0

'typedef Foo;'也许 –

+0

@ Jean-FrançoisFabreIIRC那是一个编译错误 –

回答

8

转发声明类来代替:

class Something; 
typedef std::vector<Something> Foo; 
class Something { Foo *thing; }; 

如果您正在使用C++ 11版本或更高版本,代替typedef的使用using声明:

class Something; 
using Foo = std::vector<Something>; 
class Something { Foo *thing; }; 

而这一切。

+0

...哦。咄。我很聪明。 –

+0

有没有特别的理由使用''''而不是'typedef'?当你想使用模板化的昵称时,我知道这很重要,但这不是这种情况。 –

+1

@QPaysTaxes我会说,因为我们生活在2016_中,但作为声明它对我来说也更加清晰。 – skypjack