【发布时间】:2013-07-09 05:48:02
【问题描述】:
我知道我们不能定义以不完整类型作为参数的函数,因此预计以下代码无法编译并出现错误 C2027: use of undefined type 'Derived'
class Derived;
class Base{
public:
void test(Derived d){ cout<<"test"<<endl; }
};
class Derived : public Base{
int j;
};
按照同样的逻辑,我希望当 test() 采用 Base 的对象时编译会失败,该对象在此之前是不完整类型的。但是,它没有,下面的代码编译得很好
class Derived;
class Base{
public:
void test(Base b){ cout<<"test"<<endl; }
};
class Derived : public Base{
int j;
};
在定义类时我们拥有的不完整类类型与前向声明暴露的不完整类型之间有区别吗?
【问题讨论】:
-
@Mat 复制构造函数和赋值运算符通常具有引用参数类型。如果将
Derived d更改为const Derived & d(该参数未使用),则第一个编译失败的sn-p 会编译。你说的是相关的,但不是一回事。 -
复制构造函数和赋值运算符将引用正在构造的类,这是合法的。但是,如果您尝试在类定义中声明一个类的对象,那将失败,对于函数参数,同样的逻辑应该是正确的。下面的@AndreyT 给出了正确的原因。
标签: c++ incomplete-type