Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;使用指令向前声明_C++_C++11 - Fatal编程技术网

C++ C++;使用指令向前声明

C++ C++;使用指令向前声明,c++,c++11,C++,C++11,我有一个头,它通过使用公开一个模板类和一个typedef,类似于: namespace fancy { struct Bar { ... } template<typename T> class Foo { ... } using FooBar = Foo<Bar>; } 类似于类或结构,但没有运气。这是否可能,如果可能,如何实现?您不能在不定义别名的情况下使用别名声明。但是,您可以在不定义类模板的情况下声明类模板,并使

我有一个头,它通过使用公开一个模板类和一个typedef,类似于:

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;
}