C++中的前向声明错误
Forward declaration error in C++
我在一个 hpp 文件中定义了一个 class,我试图在另一个 header 中使用它,所以我对它做了一个前向声明(我只想通过引用使用它作为函数参数)。出于某种原因,我不断收到编译错误。我不知道为什么它不起作用。这是我的代码:
//something.hpp:
class MyClass;
void someFunction (MyClass& mc);
...
//something.cpp:
#include "MyClass.hpp"
void someFunction (MyClass& mc) {...}
...
//MyClass.hpp:
class MyClass {
const char* myText;
public:
MyClass (const char* text) : myText(text) {}
};
//main.cpp:
int main () {
...
someFunction (MyClass ("some text here"));
...
}
我从 main() 中得到一个错误,它说:
'<function-style-cast>' : cannot convert from 'const char [15]' to 'MyClass'
Source or target has incomplete type
如果我没理解错,这意味着编译器没有找到 MyClass 的定义,只有它的预声明(即使我在 something.cpp 中包含了 MyClass.hpp),这就是为什么它说它不完整。我在这里错过了什么?
函数
void someFunction (MyClass& mc);
正在接受对 MyClass
实例的非常量引用。
不允许将临时函数传递给此类函数。
代码应该是
#include "MyClass.hpp"
...
int main() {
MyClass m("some text here");
someFunction(m);
}
或者您需要接受一个 const 引用。
void someFunction (const MyClass& mc);
我认为问题与前向声明无关,而是您不能将临时变量传递给以引用作为参数的函数。事实上,如果您将所有定义放在一个文件中,它仍然无法编译。另一方面,如果将 main 的代码替换为以下代码,它将编译:
int main() {
MyClass mc("Some text here");
someFunction(mc);
}
我在一个 hpp 文件中定义了一个 class,我试图在另一个 header 中使用它,所以我对它做了一个前向声明(我只想通过引用使用它作为函数参数)。出于某种原因,我不断收到编译错误。我不知道为什么它不起作用。这是我的代码:
//something.hpp:
class MyClass;
void someFunction (MyClass& mc);
...
//something.cpp:
#include "MyClass.hpp"
void someFunction (MyClass& mc) {...}
...
//MyClass.hpp:
class MyClass {
const char* myText;
public:
MyClass (const char* text) : myText(text) {}
};
//main.cpp:
int main () {
...
someFunction (MyClass ("some text here"));
...
}
我从 main() 中得到一个错误,它说:
'<function-style-cast>' : cannot convert from 'const char [15]' to 'MyClass'
Source or target has incomplete type
如果我没理解错,这意味着编译器没有找到 MyClass 的定义,只有它的预声明(即使我在 something.cpp 中包含了 MyClass.hpp),这就是为什么它说它不完整。我在这里错过了什么?
函数
void someFunction (MyClass& mc);
正在接受对 MyClass
实例的非常量引用。
不允许将临时函数传递给此类函数。
代码应该是
#include "MyClass.hpp"
...
int main() {
MyClass m("some text here");
someFunction(m);
}
或者您需要接受一个 const 引用。
void someFunction (const MyClass& mc);
我认为问题与前向声明无关,而是您不能将临时变量传递给以引用作为参数的函数。事实上,如果您将所有定义放在一个文件中,它仍然无法编译。另一方面,如果将 main 的代码替换为以下代码,它将编译:
int main() {
MyClass mc("Some text here");
someFunction(mc);
}