【发布时间】:2012-08-31 09:15:47
【问题描述】:
我想知道是否有人可以在不进行重组的情况下就解决这种情况的方法提供建议:我有一个包含类声明的标头并声明了许多通过引用/指针使用的类,这显然是比较好的做法简单地包含这些类的标题。
struct Foo;
struct Bar;
struct MyStruct
{
void doIt( const Foo* foo );
void doIt( const Bar* bar );
};
然而,虽然在上面的例子中 Foo 是一个类,但 Bar 实际上是一个类的 typedef,如下面的粗略例子:
#include <fd_ex.h>
struct Foo
{
int a;
};
struct Bar_
{
int a;
};
typedef Bar_ Bar;
这会导致一些问题,因为预先声明 struct Bar 显然不正确 - Bar 不是结构:
"fd_ex.cpp", line 13: Error: Multiple declaration for Bar.
"fd_ex.cpp", line 19: Error: The name Bar is ambiguous, Bar and Bar.
2 Error(s) detected.
如果可能的话,我不想公开Bar_,主要是因为在现实生活中这可能比这个例子复杂得多。
但是,如果我 无法控制 Bar 的 struct 声明和 typedef,我是否可以在 MyStruct 的标头中使用任何技术来保持 pre-声明Bar?
【问题讨论】:
-
我猜你的编译器只是混淆了你将 bar 预定义为一个类,然后(通过 typedef)作为结构 Bar_。尝试使用 struct bar;而是在您的头文件中。另外,在无意义地抨击别人使用结构体之前,请记住msdn.microsoft.com/en-us/library/ms229017.aspx这一点;-)
-
你基本上是在说,“我想声明一个函数,但我不会告诉你参数的类型。”你不能那样做。
-
@Najzero:它们实际上都是结构,但对于这个例子来说并不重要,因为
Bar既不是类也不是结构。我将更改示例以使其更清晰,但为免生疑问,它仍然没有帮助。 -
@KerrekSB:我想知道的是如何通过预先声明一个实际上不是结构而是 typedef 的结构来告诉编译器
Bar是什么而不会混淆它。 -
@Component10:如果你拒绝告诉编译器
Bar是什么,你就不能告诉编译器Bar是什么!唯一正确的方法是声明typedef struct Bar_ Bar;,这就是Bar是。