1

问题的简单版本:

图书馆.h

 typedef library::whatever::something::complicated X;

我可以在不包含 library.h 的情况下前向声明 X 吗?


基本上我想做的是:

Foo.h:

// forward declare X

void foo (const X &);

酒吧.h:

#include <library>
typedef library::type<blah>::whatever Bar;
typedef Bar X;

Foo.cpp:

#include <Foo.h>
#include <Bar.h>

foo (const X &) {...

主.cpp:

#include <Foo.h>
#include <Bar.h>

foo (X ());

前提是我不想包括<library>,除非我必须。假设它与其他标头交互不良,但是这些其他标头需要声明foo. 如果不包含库,将无法调用foo(),但这是 .cpps 需要担心的事情。

如果我想将 X 类型定义为普通的 C 类,则前向声明 C 就足够了,但这在这里行不通。

我可以将 X 前向声明为 typedef,但仅当我已经定义了library::type<blah>(也许还有 blah 的定义)时才可以使用 AFAIK。

前向声明的重点不是#include这些类型的定义。

这是一个相关的问题:

namespace std
{
    template <typename T>
    class vector;
}

typedef std :: vector <int> Buffer;

void foo (const Buffer &);

#include <vector> // ok until here

int main ()
{
    foo (Buffer ());
}

在这种情况下,std::vector 的前向声明与定义不兼容。让我们假装我真的不想#include <vector>或任何外部课程)。

有没有解决的办法?

4

2 回答 2

1

我认为这很难做到,因为typedef library::type<blah>::whatever Bar;需要类库::类型的完整定义,这不是可以解决的前向声明。

于 2013-08-18T13:07:48.300 回答
1

您不能转发声明嵌套类,请参阅此答案

但是,如果你的类没有嵌套,你可以这样做:

// inside library_fwd.hpp:
namespace library {
namespace whatever {

template <class T>
class Something;
typedef Something<int> IntSomething;

} // namespace whatever
} // namespace library

和:

// inside foo.cpp
#include "library_fwd.hpp"
void foo(const library::whatever::IntSomething&);

您对 std::vector 示例的问题与声明冲突有关。见std::vector。使固定:

namespace std {
  template <class T>
  class allocator;

  template <typename T, class Allocator>
  class vector;
}

typedef std::vector<int, std::allocator<int>> Buffer;

void foo(const Buffer &);

#include <vector> // now ok

int main () {
  foo (Buffer ());
}

一些标准库前向声明的PS示例:http: //en.cppreference.com/w/cpp/header/iosfwd

于 2013-08-18T13:36:23.410 回答