我有一个返回对某事物的引用的类方法。当我使用这个方法时,如果我只有那个东西的前向声明,我只有在分配方法的输出时才能编译。我真的不明白为什么......
这是一个简化的例子:
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 编译它。
最佳答案
看起来像是编译器的“限制”,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/