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

时间:2014-08-27 17:14:21

标签: c++ visual-studio forward-declaration

我有一个返回对某事物的引用的类方法。当我使用这个方法时,如果我只有这个东西的前向声明,我只能编译,如果我分配方法的输出。我真的不明白为什么......

这是一个简化的例子:

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进行编译。

1 个答案:

答案 0 :(得分:5)

看起来像编译器的“限制”,the MSDN page for C2027 says

  

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

     

以下示例生成C2027。

并给出了这个例子:

class A;
A& CreateA();

class B;
B* CreateB();

int main() {
   CreateA();   // C2027
   CreateB();   // OK
}

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