gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:30:31 26 4
gpt4 key购买 nike

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

这是一个简化的例子:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com