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

标签 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 的前向声明),它将无法编译:

ma​​in.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 编译它。

最佳答案

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

It is possible to declare a pointer to a declared but undefined type. But Visual C++ does not allow a reference to an undefined type.

The following sample generates C2027.

并给出这个例子:

class A;
A& CreateA();

class B;
B* CreateB();

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

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

关于c++ - 返回对前向声明类型的引用 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25533207/

相关文章:

c++ - 不改变值的函数

c++ - NOMINMAX 与 Visual Studio 2012 MFC 项目

c++ - 集合比较器的前向声明

c++ - c++ 中的字符减法

c++ - 如何获取当前运行模块的sc_module_name

c++ - 从文件读取时tellg() 的行为如何?

visual-studio - 为什么 MSBuild 将 .tlog 文件生成到 CMakeFiles/CompilerIdC 中,我该如何让它停止?

c# - "A call to a PInvoke function has unbalanced the stack"

添加新头文件时出现 C++ 错误 LNK2005

c++ - 一个类作为另一个类的友元的成员函数