C++ C++;使用指令向前声明
我有一个头,它通过使用公开一个模板类和一个typedef,类似于:C++ C++;使用指令向前声明,c++,c++11,C++,C++11,我有一个头,它通过使用公开一个模板类和一个typedef,类似于: namespace fancy { struct Bar { ... } template<typename T> class Foo { ... } using FooBar = Foo<Bar>; } 类似于类或结构,但没有运气。这是否可能,如果可能,如何实现?您不能在不定义别名的情况下使用别名声明。但是,您可以在不定义类模板的情况下声明类模板,并使
namespace fancy {
struct Bar {
...
}
template<typename T>
class Foo {
...
}
using FooBar = Foo<Bar>;
}
类似于类或结构,但没有运气。这是否可能,如果可能,如何实现?您不能在不定义别名的情况下使用
别名声明。但是,您可以在不定义类模板的情况下声明类模板,并使用
别名使用重复的:
namespace fancy {
template <typename> class Foo;
class Bar;
using FooBar = Foo<Bar>;
}
名称空间{
模板类Foo;
分类栏;
使用FooBar=Foo;
}
使用前向声明的另一种方法是将使用
替换为类继承:
// using FooBar = Foo<Bar>;
class FooBar : public Foo<Bar> {};
如果using声明太大(许多模板参数也由using语句定义),还可以添加一个将using类型作为从属类型的伪转发结构:
名称空间{
结构条{
...
}
模板
福班{
...
}
使用FooBar=Foo;
//正向结构
结构FooBarFwd{
使用type=FooBar;
}
}
然后在您要转发声明的位置:
名称空间{
FooBarFwd类;
}
//使用您的类型作为
typename FooBarFwd::type baz(const typename FooBarFwd::type&myFooBar);
//而不是
//FooBar baz(const FooBar&myFooBar);
这种方法的一些缺点是
- 使用
typename
消除依赖类型的歧义
- 对于您的类型,某些编译器在报告错误时可能会出现问题
- 更改此方法可能需要对代码进行大量更改(使用
typename FooBarFw::type更改每次出现的FooBar
)
因此,我建议只有当你确定自己在做什么时才应用这项技术。如果我这样做,我会得到错误:“using FooBar=class Foo”之前在gcc 4.8.1中有一个声明为“using FooBar=class Foo”
。这两个都是相对较新的gcc(4.9.0 20131031(实验版))和clang(3.4版(trunk 193991))在没有代码的情况下编译由我的声明组成的代码(通过添加分号和删除…
)不会出现问题。但是,Clang抱怨Bar
的struct
和class
不匹配。
// using FooBar = Foo<Bar>;
class FooBar : public Foo<Bar> {};
namespace fancy {
class FooBar;
}