我们如何在头文件中使用 Foo 类而不访问其定义?
- 我们可以声明 Foo* 或 Foo& 类型的数据成员。
- 我们可以用 Foo 类型的参数和/或返回值声明(但不能定义)函数。(一个例外是,如果参数 Foo 或 const Foo& 具有非显式的单参数构造函数,在这种情况下,我们需要完整的定义来支持自动类型转换。)
- 我们可以声明 Foo 类型的静态数据成员。这是因为静态数据成员是在类定义之外定义的。
我很好奇的是第二个项目符号中的异常。为什么会这样?如果我们想支持自动类型转换,为什么需要完整的定义?
我的猜测是编译器需要目标类型的完整定义,因为在隐式转换中创建了临时对象。我猜对了吗?还有更多吗?
编辑:
正如我所看到的,指南中的例外是针对这样的情况:
class A
{
public:
A( int );
};
class B
{
public:
B( A const &a );
};
int main()
{
B b(2);
}
这里我们只有一个用户定义的隐式转换(从 int 到 A),并调用接受 A const & 的构造函数。在此异常中唯一有意义的是支持从例如 int 到 A,然后通过接受 A const & 的构造函数到 B 的直接转换,允许客户端代码使用此转换链,而无需显式包含 A 类所在的头文件宣布。