问题的简单版本:
图书馆.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>
或任何外部课程)。
有没有解决的办法?