返回对前向声明类型(C++)的引用

Returning a reference to a forward-declared type (C++)

本文关键字:C++ 引用 类型 声明 返回      更新时间:2023-10-16

我有一个类方法,它返回对某个对象的引用。当我使用这个方法时,如果我只有那个东西的前向声明,我只能在分配该方法的输出的情况下编译。我真的不明白为什么。。。

这里有一个简化的例子:

ClassA.h:

//Forward declare
class ClassB;
class ClassA
{
public:
    ClassA(void);
    ~ClassA(void);
    ClassB& Func();
};

ClassA.cpp:

#include "ClassA.h"
#include "ClassB.h"
ClassA::ClassA(void)
{}
ClassA::~ClassA(void)
{}
static ClassB c;
ClassB& ClassA::Func()
{
    return c;
}

ClassB.h:

#pragma once
class ClassB
{
public:
    ClassB(void) {};
    ~ClassB(void) {};
};

现在,如果我在不分配返回值的情况下调用ClassA::Func(同时只有ClassB的前向声明),它将不会编译:

main.cpp:

#include "ClassA.h"
int main(void)
{
    ClassA a;
    a.Func(); //error C2027: use of undefined type 'ClassB'
    return 0;
}

如果我使用这条线,它会起作用:ClassB& b = a.Func();

这里发生了什么?当返回值没有分配到任何位置时,编译器为什么需要知道ClassB的大小或它的方法是什么?

我正在使用VisualStudio 2010 SP1编译此代码。

看起来像一个"限制";关于编译器,C2027的MSDN页面上写着:

可以声明指向已声明但未定义类型的指针但是Visual C++不允许引用未定义的类型

以下示例生成C2027。

举个例子:

class A;
A& CreateA();
class B;
B* CreateB();
int main() {
   CreateA();   // C2027
   CreateB();   // OK
}

所以你的两个例子都应该生成C2027,我不知道为什么第二个没有(也就是说,如果没有更多的文档,这是一个错误)