Sam*_*sle 15 c++ forward-declaration visual-studio
我有一个类方法返回对某事物的引用.当我使用这个方法时,如果我只有这个东西的前向声明,我只能编译,如果我分配方法的输出.我真的不明白为什么......
这是一个简化的例子:
ClassA.h:
//Forward declare
class ClassB;
class ClassA
{
public:
ClassA(void);
~ClassA(void);
ClassB& Func();
};
Run Code Online (Sandbox Code Playgroud)
ClassA.cpp:
#include "ClassA.h"
#include "ClassB.h"
ClassA::ClassA(void)
{}
ClassA::~ClassA(void)
{}
static ClassB c;
ClassB& ClassA::Func()
{
return c;
}
Run Code Online (Sandbox Code Playgroud)
ClassB.h:
#pragma once
class ClassB
{
public:
ClassB(void) {};
~ClassB(void) {};
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我在ClassA::Func
没有分配返回值的情况下调用(虽然只有前向声明ClassB
),它将无法编译:
main.cpp中:
#include "ClassA.h"
int main(void)
{
ClassA a;
a.Func(); //error C2027: use of undefined type 'ClassB'
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我改用这一行,它的工作原理是: 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
}
Run Code Online (Sandbox Code Playgroud)
所以你的两个例子都应该生成一个C2027,我不知道为什么第二个没有(也就是说,没有更多文档,这是一个bug)
归档时间: |
|
查看次数: |
414 次 |
最近记录: |